亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
什麼是數(shù)據(jù)驗(yàn)證?
為什麼數(shù)據(jù)驗(yàn)證很重要?
# 提升安全性
# 防止存儲(chǔ)不正確的數(shù)據(jù)
# 確保 Artisan 命令輸入正確
客戶(hù)端驗(yàn)證與服務(wù)器端驗(yàn)證
# 客戶(hù)端驗(yàn)證
# 服務(wù)器端驗(yàn)證
Laravel 如何處理驗(yàn)證
# 手動(dòng)驗(yàn)證數(shù)據(jù)
# 使用表單請(qǐng)求類(lèi)驗(yàn)證數(shù)據(jù)
Laravel 中常用的驗(yàn)證規(guī)則
# 驗(yàn)證數(shù)組
# 驗(yàn)證日期
# 驗(yàn)證密碼
# 驗(yàn)證顏色
# 驗(yàn)證文件
# 驗(yàn)證數(shù)據(jù)庫(kù)中是否存在字段
# 驗(yàn)證數(shù)據(jù)庫(kù)中字段的唯一性
創(chuàng)建您自己的驗(yàn)證規(guī)則
測(cè)試您自己的驗(yàn)證規(guī)則
結(jié)論
首頁(yè) 後端開(kāi)發(fā) php教程 Laravel驗(yàn)證的最終指南

Laravel驗(yàn)證的最終指南

Mar 06, 2025 am 12:46 AM

The ultimate guide to Laravel Validation

數(shù)據(jù)驗(yàn)證是任何 Web 應(yīng)用的關(guān)鍵組成部分。它有助於防止安全漏洞、數(shù)據(jù)損壞以及使用用戶(hù)輸入時(shí)可能出現(xiàn)的各種其他問(wèn)題。

本文將探討什麼是數(shù)據(jù)驗(yàn)證以及它為何如此重要。我們將比較客戶(hù)端驗(yàn)證和服務(wù)器端驗(yàn)證,並解釋為什麼不應(yīng)僅依賴(lài)客戶(hù)端驗(yàn)證。

然後,我們將介紹一些我在 Laravel 應(yīng)用中常用的便捷驗(yàn)證規(guī)則。最後,我們將學(xué)習(xí)如何創(chuàng)建自己的驗(yàn)證規(guī)則並進(jìn)行測(cè)試,以確保其按預(yù)期工作。

什麼是數(shù)據(jù)驗(yàn)證?


數(shù)據(jù)驗(yàn)證是在嘗試使用數(shù)據(jù)之前檢查數(shù)據(jù)有效性的過(guò)程。這可以是檢查簡(jiǎn)單的項(xiàng)目,例如請(qǐng)求中是否存在必填字段,也可以是更複雜的檢查,例如字段是否與特定模式匹配或在數(shù)據(jù)庫(kù)中是否唯一。

通常,在 Web 應(yīng)用中驗(yàn)證數(shù)據(jù)時(shí),如果數(shù)據(jù)無(wú)效,您需要向用戶(hù)返回錯(cuò)誤消息。

這有助於防止安全漏洞、數(shù)據(jù)損壞並提高數(shù)據(jù)準(zhǔn)確性。因此,只有在數(shù)據(jù)有效的情況下,我們才會(huì)繼續(xù)處理請(qǐng)求。

記住,不能信任來(lái)自用戶(hù)的任何數(shù)據(jù)(至少在您驗(yàn)證它之前?。?。

為什麼數(shù)據(jù)驗(yàn)證很重要?


數(shù)據(jù)驗(yàn)證之所以重要,原因有很多,包括:

# 提升安全性

在您的應(yīng)用中驗(yàn)證數(shù)據(jù)最重要的原因之一是提升安全性。通過(guò)在使用數(shù)據(jù)之前對(duì)其進(jìn)行驗(yàn)證,您可以降低惡意輸入被用來(lái)攻擊您的應(yīng)用或用戶(hù)的可能性。

# 防止存儲(chǔ)不正確的數(shù)據(jù)

想像一下,我們期望某個(gè)字段是整數(shù),但用戶(hù)卻傳遞了一個(gè)文件。當(dāng)我們嘗試在應(yīng)用的其他地方使用該數(shù)據(jù)時(shí),這可能會(huì)導(dǎo)致各種問(wèn)題。

再舉一個(gè)例子,假設(shè)您正在構(gòu)建一個(gè)允許用戶(hù)對(duì)投票進(jìn)行投票的 Web 應(yīng)用。只能在 AppModelsPoll 模型上指定的 opens_at 時(shí)間和 closes_at 時(shí)間之間對(duì)投票進(jìn)行投票。如果有人設(shè)置投票時(shí)不小心將 closes_at 時(shí)間設(shè)置為早於 opens_at 時(shí)間,會(huì)發(fā)生什麼情況?根據(jù)您在應(yīng)用中如何處理這種情況,這可能會(huì)導(dǎo)致各種問(wèn)題。

通過(guò)在將數(shù)據(jù)存儲(chǔ)到模型之前對(duì)其進(jìn)行驗(yàn)證,我們可以提高應(yīng)用中的數(shù)據(jù)準(zhǔn)確性,並減少存儲(chǔ)不正確數(shù)據(jù)的可能性。

# 確保 Artisan 命令輸入正確

除了能夠驗(yàn)證 HTTP 請(qǐng)求中傳遞的數(shù)據(jù)外,您還可以驗(yàn)證 Artisan 命令。這可以防止開(kāi)發(fā)人員意外輸入無(wú)效值並導(dǎo)致應(yīng)用出現(xiàn)問(wèn)題。

客戶(hù)端驗(yàn)證與服務(wù)器端驗(yàn)證


通常,您可以在應(yīng)用中使用兩種類(lèi)型的驗(yàn)證:客戶(hù)端驗(yàn)證和服務(wù)器端驗(yàn)證。

# 客戶(hù)端驗(yàn)證

客戶(hù)端驗(yàn)證是在將數(shù)據(jù)發(fā)送到服務(wù)器之前在瀏覽器中執(zhí)行的驗(yàn)證。它可以使用 JavaScript 甚至 HTML 屬性來(lái)實(shí)現(xiàn)。

例如,我們可以向 HTML 中的數(shù)字字段添加一些簡(jiǎn)單的驗(yàn)證,以確保用戶(hù)輸入的數(shù)字介於 1 和 10 之間:

<input type="number" min="1" max="10" required>

此輸入字段有四個(gè)單獨(dú)的部分,對(duì)客戶(hù)端驗(yàn)證很有用:

  • type="number":這告訴瀏覽器輸入應(yīng)為數(shù)字。在大多數(shù)瀏覽器上,這將阻止用戶(hù)輸入數(shù)字以外的任何內(nèi)容。在移動(dòng)設(shè)備上,它甚至可能會(huì)調(diào)出數(shù)字鍵盤(pán)而不是常規(guī)鍵盤(pán),這對(duì)用戶(hù)體驗(yàn)非常有益。
  • min="1":這告訴瀏覽器輸入的數(shù)字必須至少為 1。
  • max="10":這告訴瀏覽器輸入的數(shù)字最多必須為 10。
  • required:這告訴瀏覽器該字段是必需的,並且必須在提交表單之前填寫(xiě)。

在大多數(shù)瀏覽器中,如果用戶(hù)嘗試使用無(wú)效值(或根本沒(méi)有值)提交表單,瀏覽器將阻止提交表單,並向用戶(hù)顯示錯(cuò)誤消息或提示。

這對(duì)指導(dǎo)用戶(hù)和改善應(yīng)用的整體用戶(hù)體驗(yàn)非常有益。但這只是它應(yīng)該被視為:一個(gè)指南。您不應(yīng)僅依賴(lài)客戶(hù)端驗(yàn)證作為應(yīng)用中唯一的驗(yàn)證形式。

如果有人在瀏覽器中打開(kāi)開(kāi)發(fā)者工具,他們可以輕鬆刪除和繞過(guò)您已設(shè)置的客戶(hù)端驗(yàn)證。

此外,重要的是要記住,當(dāng)惡意用戶(hù)試圖攻擊您的應(yīng)用時(shí),他們通常會(huì)使用自動(dòng)化腳本將請(qǐng)求直接發(fā)送到您的服務(wù)器。這意味著您已設(shè)置的客戶(hù)端驗(yàn)證將被繞過(guò)。

# 服務(wù)器端驗(yàn)證

服務(wù)器端驗(yàn)證是在服務(wù)器上的應(yīng)用後端中運(yùn)行的驗(yàn)證。在 Laravel 應(yīng)用的上下文中,這通常是在控制器或表單請(qǐng)求類(lèi)中運(yùn)行的驗(yàn)證。

由於驗(yàn)證位於您的服務(wù)器上,用戶(hù)無(wú)法更改,因此這是真正確保發(fā)送到服務(wù)器的數(shù)據(jù)有效的唯一方法。

因此,務(wù)必在您的應(yīng)用中始終啟用服務(wù)器端驗(yàn)證。理想情況下,您嘗試從請(qǐng)求中讀取的每個(gè)字段都應(yīng)在嘗試使用它執(zhí)行任何業(yè)務(wù)邏輯之前進(jìn)行驗(yàn)證。

Laravel 如何處理驗(yàn)證


現(xiàn)在我們已經(jīng)了解了什麼是驗(yàn)證以及它為什麼重要,讓我們來(lái)看看如何在 Laravel 中使用它。

如果您已經(jīng)使用 Laravel 一段時(shí)間了,您就會(huì)知道 Laravel 具有內(nèi)置於框架中的驚人的驗(yàn)證系統(tǒng)。因此,在您的應(yīng)用中開(kāi)始使用驗(yàn)證非常容易。

在 Laravel 中驗(yàn)證數(shù)據(jù)有幾種常見(jiàn)方法,但我們將介紹兩種最常見(jiàn)的方法:

  • 手動(dòng)驗(yàn)證數(shù)據(jù)
  • 使用表單請(qǐng)求類(lèi)驗(yàn)證數(shù)據(jù)

# 手動(dòng)驗(yàn)證數(shù)據(jù)

要手動(dòng)驗(yàn)證數(shù)據(jù)(例如在控制器方法中),您可以使用 IlluminateSupportFacadesValidator facade 並調(diào)用 make 方法。

然後,我們可以將兩個(gè)參數(shù)傳遞給 make 方法:

  • data - 我們要驗(yàn)證的數(shù)據(jù)
  • rules - 我們要根據(jù)其驗(yàn)證數(shù)據(jù)的規(guī)則

旁注:make 方法還接受兩個(gè)可選參數(shù):messagesattributes。這些可用於自定義返回給用戶(hù)的錯(cuò)誤消息,但我們不會(huì)在本篇文章中介紹它們。

讓我們來(lái)看一個(gè)您可能想要驗(yàn)證兩個(gè)字段的示例:

<input type="number" min="1" max="10" required>

在上面的示例中,我們可以看到我們正在驗(yàn)證兩個(gè)字段:titlebody。我們已對(duì)這兩個(gè)字段的值進(jìn)行硬編碼以使示例更清晰,但在實(shí)際項(xiàng)目中,您通常會(huì)從請(qǐng)求中獲取這些字段。我們正在檢查 title 字段是否已設(shè)置、是字符串以及最大長(zhǎng)度為 100 個(gè)字符。我們還檢查 description 字段是否已設(shè)置、是字符串以及最大長(zhǎng)度為 250 個(gè)字符。

創(chuàng)建驗(yàn)證器後,我們可以調(diào)用返回的 IlluminateValidationValidator 實(shí)例上的方法。例如,要檢查驗(yàn)證是否失敗,我們可以調(diào)用 fails 方法:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

同樣,我們也可以在驗(yàn)證器實(shí)例上調(diào)用 validate 方法:

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

if ($validator->fails()) {
    // 一個(gè)或多個(gè)字段驗(yàn)證失敗。
    // 在此處進(jìn)行處理...
}

如果驗(yàn)證失敗,此 validate 方法將引發(fā) IlluminateValidationValidationException。 Laravel 將根據(jù)所進(jìn)行的請(qǐng)求類(lèi)型自動(dòng)處理此異常(假設(shè)您沒(méi)有更改應(yīng)用中的默認(rèn)異常處理)。如果請(qǐng)求是 Web 請(qǐng)求,Laravel 將使用會(huì)話中的錯(cuò)誤將用戶(hù)重定向回上一頁(yè)以供您顯示。如果請(qǐng)求是 API 請(qǐng)求,Laravel 將返回 422 Unprocessable Entity 響應(yīng),其中包含驗(yàn)證錯(cuò)誤的 JSON 表示形式,如下所示:

Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
)->validate();

# 使用表單請(qǐng)求類(lèi)驗(yàn)證數(shù)據(jù)

在 Laravel 應(yīng)用中驗(yàn)證數(shù)據(jù)的另一種常用方法是使用表單請(qǐng)求類(lèi)。表單請(qǐng)求類(lèi)是擴(kuò)展 IlluminateFoundationHttpFormRequest 的類(lèi),用於對(duì)傳入請(qǐng)求運(yùn)行授權(quán)檢查和驗(yàn)證。

我發(fā)現(xiàn)它們是保持控制器方法整潔的好方法,因?yàn)?Laravel 會(huì)在運(yùn)行控制器方法的代碼之前自動(dòng)對(duì)請(qǐng)求中傳遞的數(shù)據(jù)運(yùn)行驗(yàn)證。因此,我們不需要自己記住在驗(yàn)證器實(shí)例上運(yùn)行任何方法。

讓我們來(lái)看一個(gè)簡(jiǎn)單的例子。假設(shè)我們有一個(gè)基本的 AppHttpControllersUserController 控制器,其中有一個(gè) store 方法允許我們創(chuàng)建一個(gè)新用戶(hù):

<input type="number" min="1" max="10" required>

在控制器方法中,我們可以看到我們接受 AppHttpRequestsUsersStoreUserRequest 表單請(qǐng)求類(lèi)(我們將在後面介紹)作為方法參數(shù)。這將向 Laravel 指示我們希望在通過(guò) HTTP 請(qǐng)求調(diào)用此方法時(shí)自動(dòng)運(yùn)行此請(qǐng)求類(lèi)中的驗(yàn)證。

然後,我們?cè)诳刂破鞣椒ㄖ惺褂谜?qǐng)求實(shí)例上的 validated 方法從請(qǐng)求中獲取已驗(yàn)證的數(shù)據(jù)。這意味著它只會(huì)返回已驗(yàn)證的數(shù)據(jù)。例如,如果我們嘗試在控制器中保存新的 profile_picture 字段,則也必須將其添加到表單請(qǐng)求類(lèi)中。否則,validated 方法將不會(huì)返回它,因此 $request->validated('profile_picture') 將返回 null。

現(xiàn)在讓我們來(lái)看看 AppHttpRequestsUsersStoreUserRequest 表單請(qǐng)求類(lèi):

use Illuminate\Support\Facades\Validator;

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

我們可以看到請(qǐng)求類(lèi)包含兩個(gè)方法:

  • authorize:此方法用於確定用戶(hù)是否有權(quán)發(fā)出請(qǐng)求。如果該方法返回 false,則會(huì)向用戶(hù)返回 403 Forbidden 響應(yīng)。如果該方法返回 true,則將運(yùn)行驗(yàn)證規(guī)則。
  • rules:此方法用於定義應(yīng)在請(qǐng)求上運(yùn)行的驗(yàn)證規(guī)則。該方法應(yīng)返回一個(gè)應(yīng)在請(qǐng)求上運(yùn)行的規(guī)則數(shù)組。

rules 方法中,我們指定 name 字段必須設(shè)置、必須是字符串並且最大長(zhǎng)度必須為 100 個(gè)字符。我們還指定 email 字段必須設(shè)置、必須是電子郵件並且在 users 表(在 email 列上)中必須唯一。最後,我們指定 password 字段必須設(shè)置並且必須通過(guò)我們已設(shè)置的默認(rèn)密碼驗(yàn)證規(guī)則(我們稍後將介紹密碼驗(yàn)證)。

如您所見(jiàn),這是將驗(yàn)證邏輯與控制器邏輯分離的好方法,我發(fā)現(xiàn)它使代碼更易於閱讀和維護(hù)。

Laravel 中常用的驗(yàn)證規(guī)則


正如我已經(jīng)提到的,Laravel 驗(yàn)證系統(tǒng)非常強(qiáng)大,可以輕鬆地將驗(yàn)證添加到您的應(yīng)用中。

在本節(jié)中,我們將快速介紹一些我喜歡的便捷驗(yàn)證規(guī)則,我認(rèn)為大多數(shù)用戶(hù)都會(huì)發(fā)現(xiàn)它們?cè)谒麄兊膽?yīng)用中很有用。

如果您有興趣查看 Laravel 中可用的所有規(guī)則,可以在 Laravel 文檔中找到它們:http://ipnx.cn/link/45d5c43856059a4f97d43d6534be52d0

# 驗(yàn)證數(shù)組

您需要運(yùn)行的一種常見(jiàn)驗(yàn)證類(lèi)型是驗(yàn)證數(shù)組。這可以是從驗(yàn)證傳遞的 ID 數(shù)組是否全部有效,到驗(yàn)證請(qǐng)求中傳遞的對(duì)像數(shù)組是否全部具有某些字段。

讓我們來(lái)看一個(gè)如何驗(yàn)證數(shù)組的示例,然後我們將討論正在執(zhí)行的操作:

<input type="number" min="1" max="10" required>

在上面的示例中,我們傳遞的是一個(gè)對(duì)像數(shù)組,每個(gè)對(duì)像都有一個(gè) nameemail 字段。

對(duì)於驗(yàn)證,我們首先定義 users 字段已設(shè)置並且是數(shù)組。然後,我們指定數(shù)組的每個(gè)項(xiàng)目(使用 users.* 定向)都是一個(gè)包含 nameemail 字段的數(shù)組。

然後,我們指定 name 字段(使用 users.*.name 定向)必須設(shè)置、必須是字符串並且不能超過(guò) 100 個(gè)字符。我們還指定 email 字段(使用 users.*.email 定向)必須設(shè)置、必須是電子郵件並且在 users 表的 email 列上必須唯一。

通過(guò)能夠在驗(yàn)證規(guī)則中使用 * 通配符,我們可以輕鬆驗(yàn)證應(yīng)用中的數(shù)據(jù)數(shù)組。

# 驗(yàn)證日期

Laravel 提供了一些您可以使用的便捷日期驗(yàn)證規(guī)則。首先,要驗(yàn)證某個(gè)字段是否為有效日期,您可以使用 date 規(guī)則:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

如果您更喜歡檢查日期是否採(cǎi)用特定格式,您可以使用 date_format 規(guī)則:

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

if ($validator->fails()) {
    // 一個(gè)或多個(gè)字段驗(yàn)證失敗。
    // 在此處進(jìn)行處理...
}

您可能需要檢查日期是否早於或晚於另一個(gè)日期。例如,假設(shè)您的請(qǐng)求中包含 opens_atcloses_at 字段,並且您要確保 closes_at 晚於 opens_at 並且 opens_at 晚於或等於今天。您可以像這樣使用 after 規(guī)則:

Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
)->validate();

在上面的示例中,我們可以看到我們已將 today 作為參數(shù)傳遞給 opens_at 字段的 after 規(guī)則。 Laravel 將嘗試使用 strtotime 函數(shù)將此字符串轉(zhuǎn)換為有效的 DateTime 對(duì)象並將其與該對(duì)象進(jìn)行比較。

對(duì)於 closes_at 字段,我們將 opens_at 作為參數(shù)傳遞給 after_or_equal 規(guī)則。 Laravel 將自動(dòng)檢測(cè)這是另一個(gè)正在驗(yàn)證的字段,並將這兩個(gè)字段相互比較。

同樣,Laravel 還提供 beforebefore_or_equal 規(guī)則,您可以使用它們來(lái)檢查日期是否早於另一個(gè)日期:

{
  "message": "The title field is required. (and 1 more error)",
  "errors": {
    "title": [
      "The title field is required."
    ],
    "description": [
      "The description field is required."
    ]
  }
}

# 驗(yàn)證密碼

作為 Web 開(kāi)發(fā)人員,我們的工作是盡力幫助用戶(hù)在線安全。我們可以做到這一點(diǎn)的一種方法是在我們的應(yīng)用中推廣良好的密碼實(shí)踐,例如要求密碼具有一定的長(zhǎng)度、包含某些字符等。

Laravel 通過(guò)提供一個(gè) IlluminateValidationRulesPassword 類(lèi)來(lái)簡(jiǎn)化我們的工作,我們可以使用該類(lèi)來(lái)驗(yàn)證密碼。

它帶有一些我們可以鏈接在一起的方法,以構(gòu)建我們想要的密碼驗(yàn)證規(guī)則。例如,假設(shè)我們希望用戶(hù)的密碼符合以下條件:

  • 至少 8 個(gè)字符長(zhǎng)
  • 至少包含一個(gè)字母
  • 至少包含一個(gè)大寫(xiě)字母和一個(gè)小寫(xiě)字母
  • 至少包含一個(gè)數(shù)字
  • 至少包含一個(gè)符號(hào)
  • 不是被洩露的密碼(即不在包含其他系統(tǒng)數(shù)據(jù)洩露中洩露密碼記錄的 Have I Been Pwned 數(shù)據(jù)庫(kù)中)

我們的驗(yàn)證可能如下所示:

<input type="number" min="1" max="10" required>

如示例所示,我們正在使用可鏈接的方法來(lái)構(gòu)建我們想要的密碼驗(yàn)證規(guī)則。但是,如果我們?cè)诙鄠€(gè)不同的地方使用這些規(guī)則(例如註冊(cè)、重置密碼、在您的帳戶(hù)頁(yè)面上更新密碼等),並且我們需要更改此驗(yàn)證以強(qiáng)制執(zhí)行至少 12 個(gè)字符,會(huì)發(fā)生什麼情況?我們需要遍歷使用這些規(guī)則的所有地方並更新它們。

為了簡(jiǎn)化此操作,Laravel 允許我們定義一組默認(rèn)的密碼驗(yàn)證規(guī)則,我們可以在整個(gè)應(yīng)用中使用它們。我們可以通過(guò)在我們的 AppProvidersAppServiceProviderboot 方法中像這樣使用 Password::defaults() 方法定義一組默認(rèn)規(guī)則:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

執(zhí)行此操作後,我們現(xiàn)在可以在驗(yàn)證規(guī)則中調(diào)用 Password::defaults(),並將我們?cè)?AppServiceProvider 中指定的規(guī)則用於:

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

if ($validator->fails()) {
    // 一個(gè)或多個(gè)字段驗(yàn)證失敗。
    // 在此處進(jìn)行處理...
}

# 驗(yàn)證顏色

我參與過(guò)的幾乎每個(gè)項(xiàng)目都包含某種形式的顏色選擇器。無(wú)論是用戶(hù)為其個(gè)人資料選擇顏色、頁(yè)面一部分的背景顏色還是其他內(nèi)容,它都是經(jīng)常出現(xiàn)的內(nèi)容。

過(guò)去,我不得不使用正則表達(dá)式(我承認(rèn)我不太了解)來(lái)驗(yàn)證顏色是否為十六進(jìn)制格式的有效顏色(例如 #FF00FF)。但是,Laravel 現(xiàn)在有一個(gè)方便的 hex_color 可以使用:

Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
)->validate();

# 驗(yàn)證文件

如果您通過(guò)服務(wù)器將文件上傳到應(yīng)用,則需要在嘗試存儲(chǔ)文件之前驗(yàn)證文件是否有效。正如您所想像的那樣,Laravel 提供了一些您可以使用的文件驗(yàn)證規(guī)則。

假設(shè)您想允許用戶(hù)上傳 PDF(.pdf)或 Microsoft Word(.docx)文件。驗(yàn)證可能如下所示:

{
  "message": "The title field is required. (and 1 more error)",
  "errors": {
    "title": [
      "The title field is required."
    ],
    "description": [
      "The description field is required."
    ]
  }
}

在代碼示例中,我們可以看到我們正在驗(yàn)證文件類(lèi)型,還設(shè)置了一些最小和最大文件大小限制。我們使用 types 方法來(lái)指定我們想要允許的文件類(lèi)型。

minmax 方法還可以接受包含其他後綴的字符串,這些後綴指示文件大小單位。例如,我們還可以使用:

  • 10kb
  • 10mb
  • 10gb
  • 10tb

此外,我們還可以使用 IlluminateValidationRulesFile 類(lèi)上的 image 方法來(lái)確保文件是圖像:

<input type="number" min="1" max="10" required>

在上面的示例中,我們正在驗(yàn)證文件是否為圖像,設(shè)置一些最小和最大文件大小限制,還設(shè)置一些最大尺寸(500 x 500 像素)。

您可能希望對(duì)應(yīng)用中的文件上傳採(cǎi)取不同的方法。例如,您可能希望直接從用戶(hù)的瀏覽器上傳到雲(yún)存儲(chǔ)(例如 S3)。如果您更喜歡這樣做,您可能需要查看我的《使用 FilePond 在 Laravel 中上傳文件》文章,該文章向您展示瞭如何執(zhí)行此操作、您可能需要採(cǎi)取的不同驗(yàn)證方法以及如何對(duì)其進(jìn)行測(cè)試。

# 驗(yàn)證數(shù)據(jù)庫(kù)中是否存在字段

您可能要進(jìn)行的另一個(gè)常見(jiàn)檢查是確保數(shù)據(jù)庫(kù)中存在某個(gè)值。

例如,假設(shè)您的應(yīng)用中有一些用戶(hù),並且您已創(chuàng)建了一個(gè)路由,以便您可以將它們批量分配給團(tuán)隊(duì)。因此,在您的請(qǐng)求中,您可能需要驗(yàn)證請(qǐng)求中傳遞的 user_ids 是否全部存在於 users 表中。

為此,您可以使用 exists 規(guī)則並傳遞您想要檢查值是否存在其中的表名:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

在上面的示例中,我們正在檢查 user_ids 數(shù)組中傳遞的每個(gè) ID 是否都存在於 users 表的 id 列中。

這是確保您正在使用的數(shù)據(jù)有效並且在嘗試使用它之前存在於數(shù)據(jù)庫(kù)中的一種好方法。

如果您想更進(jìn)一步,可以將 where 子句應(yīng)用於 exists 規(guī)則以進(jìn)一步過(guò)濾運(yùn)行的查詢(xún):

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

if ($validator->fails()) {
    // 一個(gè)或多個(gè)字段驗(yàn)證失敗。
    // 在此處進(jìn)行處理...
}

在上面的示例中,我們正在檢查 user_ids 數(shù)組中傳遞的每個(gè) ID 是否都存在於 users 表的 id 列中,並且用戶(hù)的 is_verified 列設(shè)置為 true。因此,如果我們傳遞未經(jīng)驗(yàn)證的用戶(hù) ID,則驗(yàn)證將失敗。

# 驗(yàn)證數(shù)據(jù)庫(kù)中字段的唯一性

exists 規(guī)則類(lèi)似,Laravel 還提供了一個(gè) unique 規(guī)則,您可以使用它來(lái)檢查數(shù)據(jù)庫(kù)中的值是否唯一。

例如,假設(shè)您有一個(gè) users 表,並且您要確保 email 字段唯一。您可以像這樣使用 unique 規(guī)則:

Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
)->validate();

在上面的示例中,我們正在檢查 email 字段是否已設(shè)置、是電子郵件並且在 users 表的 email 列上是唯一的。

但是,如果我們嘗試在用戶(hù)可以更新其電子郵件地址的個(gè)人資料頁(yè)面上使用此驗(yàn)證,會(huì)發(fā)生什麼情況?驗(yàn)證將失敗,因?yàn)?users 表中存在一行包含用戶(hù)嘗試更新到的電子郵件地址。在這種情況下,我們可以使用 ignore 方法在檢查唯一性時(shí)忽略用戶(hù) ID:

{
  "message": "The title field is required. (and 1 more error)",
  "errors": {
    "title": [
      "The title field is required."
    ],
    "description": [
      "The description field is required."
    ]
  }
}

如果您確實(shí)選擇使用 ignore 方法,則應(yīng)確保閱讀 Laravel 文檔中的此警告:

"您永遠(yuǎn)不應(yīng)將任何用戶(hù)控制的請(qǐng)求輸入傳遞到 ignore 方法中。相反,您只應(yīng)傳遞系統(tǒng)生成的唯一 ID,例如來(lái)自 Eloquent 模型實(shí)例的自增 ID 或 UUID。否則,您的應(yīng)用將容易受到 SQL 注入攻擊。"

也可能有時(shí)您想向 unique 規(guī)則添加其他 where 子句。您可能需要這樣做以確保電子郵件地址對(duì)於特定團(tuán)隊(duì)是唯一的(這意味著不同團(tuán)隊(duì)中的另一個(gè)用戶(hù)可以使用相同的電子郵件)。您可以通過(guò)將閉包傳遞給 where 方法來(lái)做到這一點(diǎn):

<input type="number" min="1" max="10" required>

創(chuàng)建您自己的驗(yàn)證規(guī)則


儘管 Laravel 附帶了大量?jī)?nèi)置驗(yàn)證規(guī)則,但您可能需要?jiǎng)?chuàng)建自定義驗(yàn)證規(guī)則以適應(yīng)特定用例。

謝天謝地,這在 Laravel 中也很容易做到!

讓我們來(lái)看看如何構(gòu)建自定義驗(yàn)證規(guī)則、如何使用它,然後如何為它編寫(xiě)測(cè)試。

出於本文的目的,我們不太關(guān)心我們正在驗(yàn)證的內(nèi)容。我們只想了解創(chuàng)建自定義驗(yàn)證規(guī)則的一般結(jié)構(gòu)以及如何對(duì)其進(jìn)行測(cè)試。因此,我們將創(chuàng)建一個(gè)簡(jiǎn)單的規(guī)則來(lái)檢查字符串是否為回文。

如果您不知道,回文是一個(gè)單詞、短語(yǔ)、數(shù)字或其他字符序列,其正向和反向讀取相同。例如,“racecar”是一個(gè)回文,因?yàn)槿绻崔D(zhuǎn)字符串,它仍然是“racecar”。而“l(fā)aravel”不是回文,因?yàn)槿绻崔D(zhuǎn)字符串,它將是“l(fā)evaral”。

要開(kāi)始,我們將首先通過(guò)在項(xiàng)目路由中運(yùn)行以下命令來(lái)創(chuàng)建一個(gè)新的驗(yàn)證規(guī)則:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

這應(yīng)該為我們創(chuàng)建了一個(gè)新的 App/Rules/Palindrome.php 文件:

$validator = Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
);

if ($validator->fails()) {
    // 一個(gè)或多個(gè)字段驗(yàn)證失敗。
    // 在此處進(jìn)行處理...
}

當(dāng)運(yùn)行規(guī)則時(shí),Laravel 將自動(dòng)調(diào)用 validate 方法。該方法接受三個(gè)參數(shù):

  • $attribute:正在驗(yàn)證的屬性的名稱(chēng)。
  • $value:正在驗(yàn)證的屬性的值。
  • $fail:如果驗(yàn)證失敗,您可以調(diào)用的閉包。

因此,我們可以在 validate 方法中添加我們的驗(yàn)證邏輯,如下所示:

Validator::make(
    data: [
        'title' => 'Blog Post',
        'description' => 'Blog post description',
    ],
    rules: [
        'title' => ['required', 'string', 'max:100'],
        'description' => ['required', 'string', 'max:250'],
    ]
)->validate();

在上面的規(guī)則中,我們只是檢查傳遞給規(guī)則的值是否與其反轉(zhuǎn)的值相同。如果不是,我們將使用錯(cuò)誤消息調(diào)用 $fail 閉包。這將導(dǎo)致該字段的驗(yàn)證失敗。如果驗(yàn)證通過(guò),則規(guī)則將不執(zhí)行任何操作,我們可以繼續(xù)使用我們的應(yīng)用。

現(xiàn)在我們已經(jīng)創(chuàng)建了規(guī)則,我們可以像這樣在應(yīng)用中使用它:

{
  "message": "The title field is required. (and 1 more error)",
  "errors": {
    "title": [
      "The title field is required."
    ],
    "description": [
      "The description field is required."
    ]
  }
}

儘管這是我們?yōu)檠菔灸康亩鴦?chuàng)建的簡(jiǎn)單規(guī)則,但希望這能讓您了解如何為您的應(yīng)用構(gòu)建更複雜的規(guī)則。

測(cè)試您自己的驗(yàn)證規(guī)則


就像應(yīng)用中的任何其他代碼一樣,重要的是要測(cè)試您的驗(yàn)證規(guī)則以確保它們按預(yù)期工作。否則,您可能會(huì)冒使用不按預(yù)期工作的規(guī)則的風(fēng)險(xiǎn)。

為了了解如何做到這一點(diǎn),讓我們來(lái)看看如何測(cè)試我們?cè)谏弦还?jié)中創(chuàng)建的回文規(guī)則。

對(duì)於此特定規(guī)則,我們要測(cè)試兩種情況:

  • 當(dāng)值為回文時(shí),規(guī)則通過(guò)。
  • 當(dāng)值不是回文時(shí),規(guī)則失敗。

在更複雜的規(guī)則中,您可能會(huì)有更多的情況,但出於本文的目的,我們將其保持簡(jiǎn)單。

我們將在 tests/Unit/Rules 目錄中創(chuàng)建一個(gè)名為 PalindromeTest.php 的新測(cè)試文件。

讓我們來(lái)看看測(cè)試文件,然後我們將討論正在執(zhí)行的操作:

<input type="number" min="1" max="10" required>

在上面的測(cè)試文件中,我們定義了兩個(gè)測(cè)試:rule_passes_with_a_valid_valuerule_fails_with_an_invalid_value。

正如測(cè)試名稱(chēng)所暗示的那樣,第一個(gè)測(cè)試確保當(dāng)值為回文時(shí)規(guī)則通過(guò),第二個(gè)測(cè)試確保當(dāng)值不是回文時(shí)規(guī)則失敗。

我們使用 PHPUnitFrameworkAttributesDataProvider 屬性為測(cè)試提供有效值和無(wú)效值的列表以進(jìn)行測(cè)試。這是保持測(cè)試整潔並能夠使用相同測(cè)試檢查多個(gè)值的好方法。例如,如果有人向 validValues 方法添加新的有效值,則測(cè)試將自動(dòng)針對(duì)該值運(yùn)行。

rule_passes_with_a_valid_value 測(cè)試中,我們使用有效值調(diào)用規(guī)則上的 validate 方法。我們將閉包傳遞給 fail 參數(shù)(如果規(guī)則內(nèi)部驗(yàn)證失敗,則調(diào)用此參數(shù))。我們已指定如果執(zhí)行閉包(即驗(yàn)證失?。?,則測(cè)試應(yīng)失敗。如果我們?cè)跊](méi)有執(zhí)行閉包的情況下到達(dá)測(cè)試的結(jié)尾,那麼我們就知道規(guī)則通過(guò)了,並且可以添加簡(jiǎn)單的斷言 assertTrue(true) 來(lái)通過(guò)測(cè)試。

rule_fails_with_an_invalid_value 測(cè)試中,我們與第一個(gè)測(cè)試一樣,但這次我們將無(wú)效值傳遞給規(guī)則。我們已指定如果執(zhí)行閉包(即驗(yàn)證失?。?,則測(cè)試應(yīng)通過(guò),因?yàn)槲覀兤谕{(diào)用閉包。如果我們?cè)跊](méi)有執(zhí)行閉包的情況下到達(dá)測(cè)試的結(jié)尾,則不會(huì)執(zhí)行任何斷言,並且 PHPUnit 應(yīng)該為我們觸發(fā)警告。但是,如果您更喜歡更明確地確保測(cè)試失敗而不是僅僅給出錯(cuò)誤,您可能需要採(cǎi)取略微不同的方法來(lái)編寫(xiě)測(cè)試。

結(jié)論


在本文中,我們研究了什麼是驗(yàn)證以及它為什麼重要。我們比較了客戶(hù)端驗(yàn)證和服務(wù)器端驗(yàn)證,並探討了為什麼客戶(hù)端驗(yàn)證不應(yīng)僅用作應(yīng)用中唯一的驗(yàn)證形式。

我們還介紹了一些我喜歡在我的 Laravel 應(yīng)用中使用的便捷驗(yàn)證規(guī)則。最後,我們探討瞭如何創(chuàng)建您自己的驗(yàn)證規(guī)則並對(duì)其進(jìn)行測(cè)試以確保其按預(yù)期工作。

希望您現(xiàn)在應(yīng)該有足夠的信心開(kāi)始使用更多驗(yàn)證來(lái)提高應(yīng)用的安全性和可靠性。

以上是Laravel驗(yàn)證的最終指南的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

PHP正則密碼強(qiáng)度 PHP正則密碼強(qiáng)度 Jul 03, 2025 am 10:33 AM

判斷密碼強(qiáng)度需結(jié)合正則與邏輯處理,基礎(chǔ)要求包括:1.長(zhǎng)度不少於8位;2.至少含小寫(xiě)字母、大寫(xiě)字母、數(shù)字;3.可加入特殊字符限制;進(jìn)階方面需避免連續(xù)重複字符及遞增/遞減序列,這需PHP函數(shù)檢測(cè);同時(shí)應(yīng)引入黑名單過(guò)濾常見(jiàn)弱密碼如password、123456;最終建議結(jié)合zxcvbn庫(kù)提升評(píng)估精度。

如何將兩個(gè)PHP陣列組合獨(dú)特的值? 如何將兩個(gè)PHP陣列組合獨(dú)特的值? Jul 02, 2025 pm 05:18 PM

要合併兩個(gè)PHP數(shù)組並保留唯一值,有兩種主要方法。 1.對(duì)於索引數(shù)組或僅需值去重的情況,使用array_merge和array_unique組合:先用array_merge($array1,$array2)合併數(shù)組,再用array_unique()去重,最終得到包含所有唯一值的新數(shù)組;2.對(duì)於關(guān)聯(lián)數(shù)組且希望保留第一個(gè)數(shù)組中的鍵值對(duì)時(shí),使用 運(yùn)算符:$result=$array1 $array2,這將確保第一個(gè)數(shù)組中的鍵不會(huì)被第二個(gè)數(shù)組覆蓋。這兩種方法分別適用於不同場(chǎng)景,根據(jù)是否需要保留鍵名或只關(guān)注

PHP變量範(fàn)圍解釋了 PHP變量範(fàn)圍解釋了 Jul 17, 2025 am 04:16 AM

PHP變量作用域常見(jiàn)問(wèn)題及解決方法包括:1.函數(shù)內(nèi)部無(wú)法訪問(wèn)全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次並在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過(guò)濾;4.匿名函數(shù)需通過(guò)use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助於避免錯(cuò)誤並提升代碼穩(wěn)定性。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗(yàn)證來(lái)源與類(lèi)型、控製文件名與路徑、設(shè)置服務(wù)器限制並二次處理媒體文件。 1.驗(yàn)證上傳來(lái)源通過(guò)token防止CSRF並通過(guò)finfo_file檢測(cè)真實(shí)MIME類(lèi)型使用白名單控制;2.重命名文件為隨機(jī)字符串並根據(jù)檢測(cè)類(lèi)型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問(wèn)上傳目錄;4.GD庫(kù)重新保存圖片清除潛在惡意數(shù)據(jù)。

在PHP中評(píng)論代碼 在PHP中評(píng)論代碼 Jul 18, 2025 am 04:57 AM

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

撰寫(xiě)PHP評(píng)論的提示 撰寫(xiě)PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

寫(xiě)好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋?xiě)?yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過(guò)於簡(jiǎn)單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類(lèi)、方法說(shuō)明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說(shuō)明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說(shuō)明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問(wèn)題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

發(fā)電機(jī)如何在PHP中工作? 發(fā)電機(jī)如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

如何在PHP中創(chuàng)建數(shù)組? 如何在PHP中創(chuàng)建數(shù)組? Jul 02, 2025 pm 05:01 PM

在PHP中創(chuàng)建數(shù)組的方法有兩種:使用array()函數(shù)或使用中括號(hào)[]。 1.使用array()函數(shù)是傳統(tǒng)方式,兼容性好,定義索引數(shù)組如$fruits=array("apple","banana","orange"),關(guān)聯(lián)數(shù)組如$user=array("name"=>"John","age"=>25);2.使用[]是從PHP5.4開(kāi)始支持的更簡(jiǎn)潔的方式,如$color

See all articles