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]);
}
提交空表單的錯誤資訊提示