LaravelのFormRequestでValidationルールの外部ファイル化と、項目名とエラーメッセージを日本語化する方法。
自分用の備忘としてメモ。
Requestファイルの準備
artisanでRequestの拡張を作る。
php artisan make:request CreateUserRequest
作成されたファイルにValidationルールを書く
rules()
には、'フィールド名' => 'ルール'
の形式でValidationルール。
attributes()
には、'フィールド名' => '項目名'
の形式で項目名。
messages()
には、'フィールド名.ルール' => 'メッセージ'
の形式でメッセージ。
CreateUserRequest.php
namespace App\Http\Requests;
use App\Http\Requests\Request;
use Illuminate\Foundation\Http\FormRequest;
class CreateUserRequest extends FormRequest
{
public function authorize()
{
return true;
}
/**
* Validationルール
*
* @return array
*/
public function rules()
{
return [
'name' => 'required',
'zip' => 'required',
'prefecture' => 'required',
'city' => 'required',
'address' => 'required',
'tel' => 'required',
'email' => 'required|email'
];
}
/**
* 項目名
*
* @return array
*/
public function attributes()
{
return [
'name' => '氏名',
'zip' => '郵便番号',
'prefecture' => '都道府県',
'city' => '市区町村',
'address' => '番地・ビル名',
'tel' => '電話番号',
'email' => 'E-mail'
];
}
/**
* エラーメッセージ
*
* @return array
*/
public function messages() {
return [
'name.required' => ':attributeは必須項目です。',
'zip.required' => ':attributeは必須項目です。',
'pref_id.required' => ':attributeは必須項目です。',
'city.required' => ':attributeは必須項目です。',
'address.required' => ':attributeは必須項目です。',
'tel.required' => ':attributeは必須項目です。',
'email.required' => ':attributeは必須項目です。',
'email.email' => ':attributeはメールアドレスの形式で入力してください。'
];
}
/**
* fillable
* Modelの$fillableではなく、Requestのonlyで入力値を制御
*
* @return array
*/
public function userAttributes()
{
return $this->only([
'name',
'zip',
'prefecture',
'city',
'address',
'tel',
'email',
]);
}
}
Controllerで使う
Requestの代わりに作った拡張ファイルを指定する
// use 追加
use App\Http\Requests\CreateUserRequest;
public function index()
{
return view("index");
}
public function update(CreateUserRequest $request)
{
// validationが通った状態かつ、userAttributesに書いたキーでフィルタリングされたpostデータが取れる。
// この時点でvalidationエラーが発生したら入力前の画面に戻ってくれる
$data = $request->userAttributes();
}
Viewで使う
Validationエラーは $errors->has('name')
でチェックができる。
$errors->first('name')
でエラーメッセージが取得できる。
入力値は old('name')
で取得ができる
<form action="" method="post">
<input type="text" name="name" value="{{ old('name') }}">
@if($errors->has('name'))<span>{{ $errors->first('name') }}</span>@endif
</form>