Laravel使用記錄(九)表單驗證(二)

表單請求

經過上述處理,確實可以起到表單驗證的功能,但是結果或許不是我們期望的,就拿輸出的錯誤提示來說吧,我們一般需要的是中文。Laravel也考慮到了這點,所以給我們提供了表單請求

注意事項

正式開始之前,我們需要變更下控制器的結構,上述是通過控制器的一個方法處理兩種請求,但是這在使用表單請求的時候是行不通的,我們需要建立兩個方法,分別處理GET和POST。
路由

    Route::get('register', 'IndexController@register');
    Route::post('registerStore','IndexController@registerStore');

控制器方法

    public function register()
    {
        return view('home.index.register');
    }

    public function registerStore()
    {
    }

視圖文件

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
<form method="post" action="{{url('registerStore')}}">
	<p>username:<input type="text" name="username"/></p>
    <p>password:<input type="password" name="password"/></p>
    <p>{{ csrf_field() }}
    <input type="submit" value="submit"></p>
</form>

新建表單請求
我們仍然通過artisan創建,命令如下。

php artisan make:request RegisterRequest

新建的表單請求文件會出現在app/Http/Requests文件夾下,具體內容如下。
表單請求文件

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RegisterRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
        
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

如何使用?

1.在rules中填入驗證規則

表單請求文件

    public function rules()
    {
        return [
            'username'=>'bail|required|alpha_dash|min:6',
            'password'=>'bail|required|alpha_dash|min:6',
        ];
    }
2.控制器中引入表單請求

只需要use下,並且在需要使用該表單請求的方法中注入該類即可,其他無需任何操作。
控制器

use App\Http\Requests\RegisterRequest;
public function registerStore(RegisterRequest $request)
{
}

完成這兩部就成功了嗎?我們測試了一下,居然報錯了。
HTTP狀態碼:403

This action is unauthorized.

或許你猜到了些什麼,不錯就跟我們剛纔看到的表單請求文件中的authorize方法有關。

這個方法旨在驗證用戶是否有權限進行該請求,默認返回false,沒有權限。如果我們需要進行權限判斷,例如我們只需要某個URI具有該請求權限,我們就可以書寫對應邏輯關係,滿足條件的話返回true不滿足,返回false。如果沒有特別需求,可以直接返回true。
表單請求文件

    public function authorize()
    {
        return true;
        
    }

此時我們再次提交表單,是不是出現了跟表單驗證(一)中同樣的效果。但是我們控制器方法中卻沒有書寫任何的代碼,是不是更簡單了。

設置中文提示

有些朋友可能會問,說了這麼多,不還是沒有提到開頭說的中文提示的問題,不要着急,馬上就來。

除了authorize和rules之外,我們還可以在該文件中添加新的方法messages,該方法就是用來改變提示信息的。
表單請求文件

    public function messages()
    {
        return [
            'username.required'=>'用戶名必填',
        ];
    }

return的是一個數組,數組的鍵名就是字段名“點”驗證規則,鍵值就是對應的提示信息。例如username.required就是把字段名爲username的字段和required的驗證規則結合,當用戶輸入爲空的時候,就會提示用戶名必填的中文提示了,替換了原有的The username field is required的英文提示。

但是如果每個都這麼改的話,確實有些浪費時間,有沒有更簡單的辦法呢?其實也很簡單,只需要再添加attributes方法,並跟messages相結合。

    public function attributes()
    {
        return [
            'username' => '用戶名',
            'password' => '密碼',
        ];
    }

    public function messages()
    {
        return [
            'required'=>':attribute必填',
            'alpha_dash'=>':attribute輸入的字符必須是數字,字母,-或者_',
            'min'=>':attribute不少於:min個字符',
        ];
    }

attributes方法用來設置提示中的字段名稱,暫且假定你的messages沒有設置,只設置了attributes,那麼你的錯誤提示就會變爲"The 用戶名 field is required."。當然這也不是我們需要的結果,因此我們需要更改messages。但是如果是字段名點驗證規則的改法,那麼attributes就沒有任何意義了。爲了簡化我們的設置,不再進行重複勞動,Laravel給我們提供了佔位符:attribute,在提示信息中輸入佔位符,它會被驗證字段的實際名稱取代。除了屬性佔位符,還有其它佔位符,例如:min,:max等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章