国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
什麼是數(shù)據(jù)驗(yàn)證?
為什麼數(shù)據(jù)驗(yàn)證很重要?
# 提升安全性
# 防止存儲(chǔ)不正確的數(shù)據(jù)
# 確保 Artisan 命令輸入正確
客戶端驗(yàn)證與服務(wù)器端驗(yàn)證
# 客戶端驗(yàn)證
# 服務(wù)器端驗(yàn)證
Laravel 如何處理驗(yàn)證
# 手動(dòng)驗(yàn)證數(shù)據(jù)
# 使用表單請(qǐng)求類驗(yàn)證數(shù)據(jù)
Laravel 中常用的驗(yàn)證規(guī)則
# 驗(yàn)證數(shù)組
# 驗(yàn)證日期
# 驗(yàn)證密碼
# 驗(yàn)證顏色
# 驗(yàn)證文件
# 驗(yàn)證數(shù)據(jù)庫中是否存在字段
# 驗(yàn)證數(shù)據(jù)庫中字段的唯一性
創(chuàng)建您自己的驗(yàn)證規(guī)則
測(cè)試您自己的驗(yàn)證規(guī)則
結(jié)論
首頁 後端開發(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ù)損壞以及使用用戶輸入時(shí)可能出現(xiàn)的各種其他問題。

本文將探討什麼是數(shù)據(jù)驗(yàn)證以及它為何如此重要。我們將比較客戶端驗(yàn)證和服務(wù)器端驗(yàn)證,並解釋為什麼不應(yīng)僅依賴客戶端驗(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ù)有效性的過程。這可以是檢查簡(jiǎn)單的項(xiàng)目,例如請(qǐng)求中是否存在必填字段,也可以是更複雜的檢查,例如字段是否與特定模式匹配或在數(shù)據(jù)庫中是否唯一。

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

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

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

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


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

# 提升安全性

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

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

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

再舉一個(gè)例子,假設(shè)您正在構(gòu)建一個(gè)允許用戶對(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)致各種問題。

通過在將數(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 命令。這可以防止開發(fā)人員意外輸入無效值並導(dǎo)致應(yīng)用出現(xiàn)問題。

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


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

# 客戶端驗(yàn)證

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

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

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

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

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

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

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

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

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

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

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

由於驗(yàn)證位於您的服務(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)證以及它為什麼重要,讓我們來看看如何在 Laravel 中使用它。

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

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

  • 手動(dòng)驗(yàn)證數(shù)據(jù)
  • 使用表單請(qǐng)求類驗(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。這些可用於自定義返回給用戶的錯(cuò)誤消息,但我們不會(huì)在本篇文章中介紹它們。

讓我們來看一個(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)求類型自動(dòng)處理此異常(假設(shè)您沒有更改應(yīng)用中的默認(rèn)異常處理)。如果請(qǐng)求是 Web 請(qǐng)求,Laravel 將使用會(huì)話中的錯(cuò)誤將用戶重定向回上一頁以供您顯示。如果請(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)求類驗(yàn)證數(shù)據(jù)

在 Laravel 應(yīng)用中驗(yàn)證數(shù)據(jù)的另一種常用方法是使用表單請(qǐng)求類。表單請(qǐng)求類是擴(kuò)展 IlluminateFoundationHttpFormRequest 的類,用於對(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)行任何方法。

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

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

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

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

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

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)求類包含兩個(gè)方法:

  • authorize:此方法用於確定用戶是否有權(quán)發(fā)出請(qǐng)求。如果該方法返回 false,則會(huì)向用戶返回 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è)置並且必須通過我們已設(shè)置的默認(rèn)密碼驗(yàn)證規(guī)則(我們稍後將介紹密碼驗(yà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ù)用戶都會(huì)發(fā)現(xiàn)它們?cè)谒麄兊膽?yīng)用中很有用。

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

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

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

讓我們來看一個(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è)置、必須是字符串並且不能超過 100 個(gè)字符。我們還指定 email 字段(使用 users.*.email 定向)必須設(shè)置、必須是電子郵件並且在 users 表的 email 列上必須唯一。

通過能夠在驗(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ī)則,您可以使用它們來檢查日期是否早於另一個(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 開發(fā)人員,我們的工作是盡力幫助用戶在線安全。我們可以做到這一點(diǎn)的一種方法是在我們的應(yīng)用中推廣良好的密碼實(shí)踐,例如要求密碼具有一定的長(zhǎng)度、包含某些字符等。

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

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

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

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

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

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

為了簡(jiǎn)化此操作,Laravel 允許我們定義一組默認(rèn)的密碼驗(yàn)證規(guī)則,我們可以在整個(gè)應(yīng)用中使用它們。我們可以通過在我們的 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)證顏色

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

過去,我不得不使用正則表達(dá)式(我承認(rèn)我不太了解)來驗(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)證文件

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

假設(shè)您想允許用戶上傳 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)證文件類型,還設(shè)置了一些最小和最大文件大小限制。我們使用 types 方法來指定我們想要允許的文件類型。

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

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

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

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

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

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

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

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

例如,假設(shè)您的應(yīng)用中有一些用戶,並且您已創(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ù)庫中的一種好方法。

如果您想更進(jìn)一步,可以將 where 子句應(yīng)用於 exists 規(guī)則以進(jìn)一步過濾運(yù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 列中,並且用戶的 is_verified 列設(shè)置為 true。因此,如果我們傳遞未經(jīng)驗(yàn)證的用戶 ID,則驗(yàn)證將失敗。

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

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

例如,假設(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 列上是唯一的。

但是,如果我們嘗試在用戶可以更新其電子郵件地址的個(gè)人資料頁面上使用此驗(yàn)證,會(huì)發(fā)生什麼情況?驗(yàn)證將失敗,因?yàn)?users 表中存在一行包含用戶嘗試更新到的電子郵件地址。在這種情況下,我們可以使用 ignore 方法在檢查唯一性時(shí)忽略用戶 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)將任何用戶控制的請(qǐng)求輸入傳遞到 ignore 方法中。相反,您只應(yīng)傳遞系統(tǒng)生成的唯一 ID,例如來自 Eloquent 模型實(shí)例的自增 ID 或 UUID。否則,您的應(yīng)用將容易受到 SQL 注入攻擊。"

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

讓我們來看看如何構(gòu)建自定義驗(yàn)證規(guī)則、如何使用它,然後如何為它編寫測(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ī)則來檢查字符串是否為回文。

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

要開始,我們將首先通過在項(xiàng)目路由中運(yùn)行以下命令來創(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)證的屬性的名稱。
  • $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ī)則將不執(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),讓我們來看看如何測(cè)試我們?cè)谏弦还?jié)中創(chuàng)建的回文規(guī)則。

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

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

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

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

讓我們來看看測(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è)試名稱所暗示的那樣,第一個(gè)測(cè)試確保當(dāng)值為回文時(shí)規(guī)則通過,第二個(gè)測(cè)試確保當(dāng)值不是回文時(shí)規(guī)則失敗。

我們使用 PHPUnitFrameworkAttributesDataProvider 屬性為測(cè)試提供有效值和無效值的列表以進(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è)跊]有執(zhí)行閉包的情況下到達(dá)測(cè)試的結(jié)尾,那麼我們就知道規(guī)則通過了,並且可以添加簡(jiǎn)單的斷言 assertTrue(true) 來通過測(cè)試。

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

結(jié)論


在本文中,我們研究了什麼是驗(yàn)證以及它為什麼重要。我們比較了客戶端驗(yàn)證和服務(wù)器端驗(yàn)證,並探討了為什麼客戶端驗(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)該有足夠的信心開始使用更多驗(yàn)證來提高應(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整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

對(duì)基於PHP的API進(jìn)行版本控制的最佳實(shí)踐是什麼? 對(duì)基於PHP的API進(jìn)行版本控制的最佳實(shí)踐是什麼? Jun 14, 2025 am 12:27 AM

基於toversionaphp,useUrl deuseUrl specteringforclarityAndEsofRouting,單獨(dú)的codetoavoidConflicts,dremecateOldVersionswithClearCommunication,andConsiderCustomHeadeSerlySerallyWhennEnncelsy.startbyplacingtheversionIntheUrl(E.G.,epi/api/v

如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? 如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

PHP中的程序和麵向?qū)ο蟮木幊坦?fàn)例之間有什麼區(qū)別? PHP中的程序和麵向?qū)ο蟮木幊坦?fàn)例之間有什麼區(qū)別? Jun 14, 2025 am 12:25 AM

procemal and object-tiriendedprogromming(oop)inphpdiffersimplessintustructure,可重複使用性和datahandling.1.procedural-Progrogursmingusesfunctimesfunctionsormanized sequalized sequalized sequiential,poiperforsmallscripts.2.OpporganizesCodeOrganizescodeOdeIntsocloceSandObjects,ModelingReal-Worlden-Worlden

PHP中有哪些弱參考(弱圖),何時(shí)有用? PHP中有哪些弱參考(弱圖),何時(shí)有用? Jun 14, 2025 am 12:25 AM

PHPdoesnothaveabuilt-inWeakMapbutoffersWeakReferenceforsimilarfunctionality.1.WeakReferenceallowsholdingreferenceswithoutpreventinggarbagecollection.2.Itisusefulforcaching,eventlisteners,andmetadatawithoutaffectingobjectlifecycles.3.YoucansimulateaWe

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在於驗(yàn)證文件類型、重命名文件並限制權(quán)限。 1.使用finfo_file()檢查真實(shí)MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機(jī)文件名,存儲(chǔ)至非Web根目錄;3.通過php.ini和HTML表單限製文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴(kuò)展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(dòng)(通過PECL或Composer安裝)創(chuàng)建客戶端實(shí)例並操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用於高性能場(chǎng)景,Predis則便於快速部署;兩者均適用於生產(chǎn)環(huán)境且文檔完善。

PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在於類型檢查的嚴(yán)格程度。 ==在比較前會(huì)進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會(huì)返回true,例如5==="5"返回false。使用場(chǎng)景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時(shí)使用。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學(xué)運(yùn)算的方法如下:1.加法用 號(hào),支持整數(shù)和浮點(diǎn)數(shù),也可用於變量,字符串?dāng)?shù)字會(huì)自動(dòng)轉(zhuǎn)換但不推薦依賴;2.減法用-號(hào),變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號(hào),適用於數(shù)字及類似字符串;4.除法用/號(hào),需避免除以零,並註意結(jié)果可能是浮點(diǎn)數(shù);5.取模用%號(hào),可用於判斷奇偶數(shù),處理負(fù)數(shù)時(shí)餘數(shù)符號(hào)與被除數(shù)一致。正確使用這些運(yùn)算符的關(guān)鍵在於確保數(shù)據(jù)類型清晰並處理好邊界情況。

See all articles