1. 程式人生 > >Laravel5.5+ 自定義表單驗證語言檔案

Laravel5.5+ 自定義表單驗證語言檔案

在使用 Laravel 的表單驗證時,如果每次都去寫自定義的錯誤資訊是一個很煩人的事,而且有的錯誤資訊可能是重複在寫,比如新增和修改使用者的錯誤資訊基本一致,這是我們就需要一個語言檔案來做這件事,這是 Laravel 所提倡的 DRY( Don't repeat yourself ).

1.安裝語言包

Laravel 的語言檔案目錄在 resources/lang 下,預設已經存在 en 語言檔案資料夾.

Laravel 的語言包推薦使用 https://github.com/overtrue/laravel-lang/ .利用 composer 安裝後,我們需要手動同步所需要的語言檔案包到 resources/lang 資料夾下. composer 安裝的所有語言包目錄在 vendor/caouecs/laravel-lang/src 下.

例如需要中文語言包,那就將中文語言包

 複製到 resources/lang 目錄下. 

2. 使用

首先需要一個表單提交的 form ,例如使用者註冊

 <form method="POST" action="{{ route('users.store') }}">
                    {{ csrf_field() }}
                    <div class="form-group">
                        <label for="name">請輸入名稱:</label>
                        <input type="text" name="name" class="form-control" value="{{ old('name') }}">
                    </div>

                    <div class="form-group">
                        <label for="email">請輸入郵箱:</label>
                        <input type="text" name="email" class="form-control" value="{{ old('email') }}">
                    </div>

                    <div class="form-group">
                        <label for="password">請輸入密碼:</label>
                        <input type="password" name="password" class="form-control" value="{{ old('password') }}">
                    </div>

                    <div class="form-group">
                        <label for="password_confirmation">請輸入確認密碼:</label>
                        <input type="password" name="password_confirmation" class="form-control" value="{{ old('password_confirmation') }}">
                    </div>

                    <button type="submit" class="btn btn-primary">註冊</button>
                </form>

2.1 利用 Illuminate\Http\Request 物件提供的 validate() 方法進行驗證

   public function store(Request $request)
    {
        $this->validate($request, [
            "name" => 'required|max:4',
            'email' => 'required|email|unique:users|max:255',
            'password' => 'required|confirmed|min:6'
        ]);


        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);

        session()->flash('success','成功啦~');
        return redirect()->route('users.show',[$user]);
    }

這時我們的提交空表單會出現錯誤提示如下

這裡的錯誤提示是 zh-CN 語言包裡預設的.可以在 resources/lang/zh-CN/validation.php 這個檔案中看到.

 錯誤提示中的 名稱不能為空 中的 名稱 二字,是 validation.php 檔案中 attributes 的陣列定義的

所有的表單中 name 屬性為 name 的欄位都會被解析成 名稱,同理, name 屬性為 first_name 的欄位會被語言包解析成 名 .那麼如果有一個奇怪的 name 屬性,比如 stock_count ,而 attributes 陣列中又沒有為我們生成相應的中文名,或是同一個 name 屬性,在 A 頁面叫做使用者名稱,而在 B 頁面需要叫做客戶,那錯誤提示又該怎麼辦呢?這時我們就需要自定義驗證欄位的屬性名.

2.1.1 自定義驗證欄位的屬性名

關於自定義驗證欄位的屬性名不建議在語言檔案中直接修改,當然直接修改是可以的,但是如果同一個欄位有兩種不同的命名,在語言檔案檔案 validation.php 中是不容易體現出來的.

所以個人推薦在 validate() 驗證方法中體現.

validate() 方法接收四個引數,第四個引數就是自定義欄位屬性名,關於第三個錯誤資訊,因為有了語言包,可以賦值為空陣列.

修改使用者註冊的 store() 方法.

 

public function store(Request $request)
    {
        $this->validate($request, [
            "name" => 'required|max:4',
            'email' => 'required|email|unique:users|max:255',
            'password' => 'required|confirmed|min:6'
        ],[],[
            "name" => "我是 validate 方法中的 name",
            "email" => "我是 validate 方法中的 email",
        ]);


        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);

        session()->flash('success','成功啦~');
        return redirect()->route('users.show',[$user]);
    }

錯誤結果

2.2 建立表單請求驗證

建立使用者的表單請求驗證

重寫 UserRequest 中的 attributes() 方法,示例如下

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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

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

        switch ($this->method()) {
            case 'POST':
                {
                    return [
                        "name" => 'required|max:4',
                        'email' => 'required|email|unique:users|max:255',
                        'password' => 'required|confirmed|min:6'
                    ];
                }
            default:
                {
                    return [];
                }
        }

    }

    public function attributes()
    {
        return [
              "name" => "我是表單請求驗證的 name",
              "email" => "我是表單請求驗證的 name",
              "password" => "我是表單請求驗證的 password",
        ];
    }


}

將請求類注入到使用者註冊的 store() 方法中.

  public function store(UserRequest $request)
    {
        
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);

        session()->flash('success', '成功啦~');
        return redirect()->route('users.show', [$user]);
    }

 提交空表單的錯誤驗證提示

2.3 手動建立驗證器

手動建立驗證器用的是 Illuminate\Support\Facades\Validator 類中的靜態方法 make() ,這個方法同樣接收 4 個引數.

修改使用者註冊的 store() 方法

public function store(Request $request)
    {

        $validator = Validator::make($request->all(), [
            "name" => 'required|max:4',
            'email' => 'required|email|unique:users|max:255',
            'password' => 'required|confirmed|min:6'
        ],[],[
            "name" => "我是手動建立驗證器中的 name ",
            "email" => "我是手動建立驗證器中的 email ",
            "password" => "我是手動建立驗證器中的 password ",
        ]);

        if ($validator->fails()) {
            return redirect('users/create')
                ->withErrors($validator)
                ->withInput();
        }

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);

        session()->flash('success', '成功啦~');
        return redirect()->route('users.show', [$user]);
    }

提交空表單的錯誤資訊提示