首頁 > 後端開發 > php教程 > Laravel中的數據驗證:正確的方式 - 自定義驗證器

Laravel中的數據驗證:正確的方式 - 自定義驗證器

Christopher Nolan
發布: 2025-02-20 11:35:11
原創
297 人瀏覽過

Data Validation in Laravel: The Right Way - Custom Validators

Laravel中的數據驗證:正確的方式 - 自定義驗證器

鑰匙要點

    可以擴展Laravel的內置數據驗證軟件包,以為特定需求創建自定義驗證規則,例如驗證包含空格的全名代碼或PIN代碼。
  • 通過擴展Laravel的IlluminateValidationValidator類並添加新方法來驗證數據及其各自的錯誤消息,可以創建自定義驗證規則。
  • >
  • >新的驗證規則必須用“ validate”前綴和標題案例中的其餘名稱命名。驗證規則將在該方法所命名的內容(沒有“ validate”前綴)的小寫中,每個單詞將被下劃線分開。 >
  • 創建自定義驗證規則後,需要創建服務提供商將這些規則綁定到Laravel的驗證包中。然後,通過app/config/app.php文件,Laravel加載了此服務提供商
  • 在上一部分中,我們學會瞭如何使用其內置數據驗證軟件包驗證Laravel中的數據,以及如何將我們的數據驗證抽象為特定的特定服務,以使代碼可重複使用Dry原理。現在,我們可以通過其各自的驗證規則為我們的應用程序中的每個實體創建驗證服務,並將其註入到我們要驗證數據並輕鬆獲取和顯示錯誤等的任何位置等。
  • 但是,如果我們想要更多?
  • >
>

本教程的源代碼可在此處提供。您只需要在能夠運行此代碼之前運行Composer安裝即可在項目目錄內安裝Laravel Framework。

需要更多

開箱即用的
> Laravel提供了許多有用且通用的驗證規則。但是,如果我們想要更多呢?如果我們需要更具體的東西怎麼辦?在我們的示例中,在TestFormValidator中,我們使用alpha_dash來驗證名稱,但這不是驗證全名的理想選擇。通常,一個人的全名將包括一個名字和姓氏,也許還有一個中間名。所有這些都將被一個空間隔開。同樣,如果我們想以形式驗證PIN代碼,我們不能使用Laravel提供的Alpha_num規則,我們也應該能夠允許其中的空間。 >

好吧,Laravel提供了輕鬆擴展其驗證軟件包並向其添加自定義驗證規則的選項。在RocketCandy/services/驗證/Create validatorextended.php中,並向其添加以下代碼:>

<span><span><?php
</span></span><span>
</span><span><span>namespace RocketCandy<span>\Services\Validation</span>;
</span></span><span>
</span><span><span>use Illuminate<span>\Validation\Validator</span> as IlluminateValidator;
</span></span><span>
</span><span><span>class ValidatorExtended extends IlluminateValidator {
</span></span><span>
</span><span>	<span>private $_custom_messages = array(
</span></span><span>		<span>"alpha_dash_spaces" => "The :attribute may only contain letters, spaces, and dashes.",
</span></span><span>		<span>"alpha_num_spaces" => "The :attribute may only contain letters, numbers, and spaces.",
</span></span><span>	<span>);
</span></span><span>
</span><span>	<span>public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) {
</span></span><span>		<span><span>parent::</span>__construct( $translator, $data, $rules, $messages, $customAttributes );
</span></span><span>
</span><span>		<span>$this->_set_custom_stuff();
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Setup any customizations etc
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@return <span>void</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function _set_custom_stuff() {
</span></span><span>		<span>//setup our custom error messages
</span></span><span>		<span>$this->setCustomMessages( $this->_custom_messages );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, spaces and dashes (hyphens and underscores)
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaDashSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z\s-_]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, numbers, and spaces
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaNumSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z0-9\s]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span><span>}	//end of class
</span></span><span>
</span><span>
</span><span><span>//EOF</span></span>
登入後複製
登入後複製

>在這裡,我們的同類將Laravel的IlluminateValidationValidator類擴展並添加了兩種新方法(dialatealphadashspaces()和varteratealatealphanumspaces()),以驗證數據及其各自的錯誤消息與占位符:屬性:屬性中的attribute中的屬性將在其中替換為runavel,以替換為運行時的名稱。正在驗證的數據字段。

現在要注意的是我們如何命名方法。所有驗證規則方法名稱必須具有驗證前綴,其餘的必須在標題案例中(當然沒有空格)。驗證規則將以命名方法的小寫(無驗證前綴)為小寫,每個單詞將被下劃線分開。因此,如果我們要添加alpha_dash_spaces驗證規則,那麼我們的相應方法將被命名為dialatealphadashspaces()。

因此,我們在此處添加了Alpha_Dash_spaces和Alpha_num_spaces驗證規則。 alpha_dash_spaces將允許字母,破折號(連字符和下劃線)和空格,而Alpha_num_spaces將僅允許字母,數字(數字0-9)和空格。

>

>我們尚未完成此課程,此類僅擴展了Laravel的驗證類。我們仍然必須使Laravel認識到它,以便當我們將新規則添加到上面的Vaidation服務中時,Laravel將知道如何根據這些規則進行驗證。

laravel文檔指出我們可以做到這一點:

<span>Validator<span>::</span>resolver( function( $translator, $data, $rules, $messages ) {
</span>	<span>return new <span>\RocketCandy\Services\Validation\ValidatorExtended</span>( $translator, $data, $rules, $messages );
</span><span>} );</span>
登入後複製
登入後複製
並將其粘貼在app/start/global.php中,或者在應用程序目錄中創建一個新文件,然後將該文件加載到app/start/global.php中。但這看起來並不干淨,修改文件我們不需要修改,在這里和那裡都貼上碎屑和碎片。不,我們寧願將所有這些相關的代碼放在一起,因此我們將創建一個服務提供商,並將我們的自定義驗證規則粘合到Laravel的驗證程序包中。

create verialationExtensionserviceProvider.php rocketcandy/services/verasonation/incem of tastectenserviceprovider.php/添加以下代碼:>

如果您已經在Laravel創建了一個服務提供商,則通常使用register()方法來執行所需的任何綁定。這是我們在這裡擴展的抽像類LimuminateUpporterServiceProvider中唯一的抽象方法。我們之所以無法將驗證擴展粘合到register()中,是因為一旦服務提供商加載了Laravel,就會觸發它,我們將遇到一個拋出的異常,因為Laravel以後將其驗證套件初始化,因此我們將稍後初始化其驗證包,因此我們將嘗試使用不存在的對象擴展不存在的東西。另一方面,啟動()方法是在請求路由之前觸發的,因此我們可以將其安全地粘貼到Laravel的驗證包中。
<span><span><?php
</span></span><span>
</span><span><span>namespace RocketCandy<span>\Services\Validation</span>;
</span></span><span>
</span><span><span>use Illuminate<span>\Support\ServiceProvider</span>;
</span></span><span>
</span><span><span>class ValidationExtensionServiceProvider extends ServiceProvider {
</span></span><span>
</span><span>	<span>public function register() {}
</span></span><span>
</span><span>	<span>public function boot() {
</span></span><span>		<span>$this->app->validator->resolver( function( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) {
</span></span><span>			<span>return new ValidatorExtended( $translator, $data, $rules, $messages, $customAttributes );
</span></span><span>		<span>} );
</span></span><span>	<span>}
</span></span><span>
</span><span><span>}	//end of class
</span></span><span>
</span><span>
</span><span><span>//EOF</span></span>
登入後複製
>

>現在,我們只需要告訴Laravel加載此服務提供商,我們將全部設置。打開您的應用程序/config/app.php,在提供商數組中添加以下內容:>

<span><span><?php
</span></span><span>
</span><span><span>namespace RocketCandy<span>\Services\Validation</span>;
</span></span><span>
</span><span><span>use Illuminate<span>\Validation\Validator</span> as IlluminateValidator;
</span></span><span>
</span><span><span>class ValidatorExtended extends IlluminateValidator {
</span></span><span>
</span><span>	<span>private $_custom_messages = array(
</span></span><span>		<span>"alpha_dash_spaces" => "The :attribute may only contain letters, spaces, and dashes.",
</span></span><span>		<span>"alpha_num_spaces" => "The :attribute may only contain letters, numbers, and spaces.",
</span></span><span>	<span>);
</span></span><span>
</span><span>	<span>public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) {
</span></span><span>		<span><span>parent::</span>__construct( $translator, $data, $rules, $messages, $customAttributes );
</span></span><span>
</span><span>		<span>$this->_set_custom_stuff();
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Setup any customizations etc
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@return <span>void</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function _set_custom_stuff() {
</span></span><span>		<span>//setup our custom error messages
</span></span><span>		<span>$this->setCustomMessages( $this->_custom_messages );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, spaces and dashes (hyphens and underscores)
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaDashSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z\s-_]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, numbers, and spaces
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaNumSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z0-9\s]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span><span>}	//end of class
</span></span><span>
</span><span>
</span><span><span>//EOF</span></span>
登入後複製
登入後複製

現在,打開app/rocketcandy/services/validation/testformvalidator.php並更新$規則屬性,以便看起來像這樣:

<span>Validator<span>::</span>resolver( function( $translator, $data, $rules, $messages ) {
</span>	<span>return new <span>\RocketCandy\Services\Validation\ValidatorExtended</span>( $translator, $data, $rules, $messages );
</span><span>} );</span>
登入後複製
登入後複製

我們用alpha_dash_spaces替換了名稱的alpha_dash驗證規則,用alpha_num_spaces替換了pin_code的alpha_num。

現在,如果我們導航到http:// /dummy/create,我們可以在“名稱和PIN代碼”字段中輸入空格,而沒有任何問題,並且數據將在提交上傳遞驗證。

>

摘要

因此,在這兩個部分教程中,我們學會了:

>

    >使用其內置的數據驗證軟件包驗證Laravel中的數據。 >
  1. >使用面向對象的方法將數據驗證抽象為其自己的獨立服務(
  2. 單一責任
  3. 成就已解鎖)。 >創建我們自己的自定義異常,以與我們的數據驗證服務一起使用(而不是使用true/false boolean值)以及如何存儲和檢索它們的錯誤。
  4. >在控制器中註入我們的數據驗證服務並使用它。
  5. >
  6. >使用我們的自定義驗證規則擴展了Laravel的驗證軟件包,並使用服務提供商自動加載它。
  7. >腳註
  8. 為了將本教程保留到我將驗證服務注入我們的控制器並在此處使用的點。在一個真實的項目中,您很可能會在其他地方使用驗證服務,在此處處理數據消毒和存儲。理想情況下,控制器應不含脂肪,並且最少的代碼。

有想法嗎?問題?在評論中開火。

>關於Laravel數據驗證和自定義驗證器的常見問題


>使用Laravel進行數據驗證有什麼好處?它提供了各種驗證規則,這些規則可以輕鬆地應用於您的數據,以確保在處理之前符合所需的標準。 Laravel的驗證系統還允許自定義驗證規則,使您能夠定義自己的數據驗證標準。當您需要以Laravel的內置驗證規則不涵蓋的方式驗證數據時。您使用驗證器:: Extend方法創建自定義驗證規則。此方法採用兩個參數:驗證規則的名稱和接收三個參數的閉合:屬性名稱,屬性值和失敗回調。在關閉中,您可以為自定義驗證規則定義邏輯。如果驗證失敗,則應通過適當的錯誤消息調用失敗回調。

>我可以將Laravel的內置驗證規則與我的自定義規則一起使用嗎?這可以通過在驗證邏輯中將驗證規則鏈接在一起來完成。例如,您可以使用“必需”規則來確保字段不是空的,然後使用自定義規則驗證數據的格式。

>

如何在laravel中顯示驗證錯誤消息?

Laravel使您可以輕鬆在視圖中顯示驗證錯誤消息。當驗證失敗時,Laravel將用戶重定向到他們的先前位置,並在會話中存儲了所有驗證錯誤。然後,您可以使用$錯誤變量在視圖中顯示這些錯誤,該變量會自動通過Laravel提供。是的,Laravel允許您自定義驗證規則自定義錯誤消息。這可以通過在語言文件中定義自定義消息,然後在驗證邏輯中引用這些消息來完成。這使您可以靈活地根據應用程序的特定需求來量身定制錯誤消息。

>如何驗證Laravel中的數組?

Laravel提供了一種使用“點表示”驗證數組的方便方法。您可以指定要驗證的數組字段,然後將驗證規則應用於其。例如,如果您有一系列電子郵件,則可以使用“電子郵件”驗證規則在數組中驗證每個電子郵件。

>

>我可以在laravel中使用條件驗證規則嗎? Laravel允許您使用條件驗證規則。這意味著您只有在滿足其他條件時才可以應用某些驗證規則。可以使用驗證器實例上的有時方法來完成此操作。

如何在laravel中驗證文件上傳?圖像','Mimes'和“大小”。這些規則允許您驗證上載文件的類型和大小,以確保它符合您的應用程序的要求。

>

>我可以在表單請求中使用自定義驗證規則嗎?表單請求中的自定義驗證規則。這可以通過在表單請求類的規則方法中定義規則來完成。然後,您可以在驗證表單請求數據時使用這些規則。

>

>如何處理Laravel中的驗證失敗?

>

>當驗證失敗在Laravel中時,它會自動將用戶重定向到他們的先前位置在會話中存儲了所有驗證錯誤。然後,您可以在視圖中處理這些錯誤,以適合您的應用程序的方式顯示給用戶。 >

以上是Laravel中的數據驗證:正確的方式 - 自定義驗證器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板