日本語であまり詳しい説明が無かったので、調べたメモ。
Laravel5.1にはRequestクラスを拡張してValidationを行うクラスを作ることができます。
これはControllerが呼ばれる前に実行されるようで、覚えると便利です。
##まずは日本語でも情報が拾えるところから
リクエストクラスの作成
php artisan make:request CreateHogeRequest
初期はこんなかんじ
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class CreateHogeRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false; // ひとまずこれをtrueにすると使える
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
// ここにValidationルールを記載
return [
];
}
}
なので、例えばこんな感じ
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class CreateHogeRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; // ひとまずこれをtrueにすると使える
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
// ここにValidationルールを記載
return [
'hogeInput' => 'required',
];
}
}
##ここから日本語で情報が少ないもの
###カスタムメッセージを作りたい
そんなときはmessageメソッドを書く
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class CreateHogeRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; // ひとまずこれをtrueにすると使える
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
// ここにValidationルールを記載
return [
'hogeInput' => 'required',
];
}
public function messages()
{
return [
'hogeInput.required' => 'ほげ入力は必須項目です。',
];
}
}
###リダイレクト先を前ページではなく違うページにしたい
デフォルトは前ページに戻るようです。
そういうときは$redirectというメンバ変数をオーバーライトする。
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
use Illuminate\Contracts\Validation\Validator;
class CreateHogeRequest extends Request
{
// リダイレクト先
protected $redirect = 'hoge/create';
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; // ひとまずこれをtrueにすると使える
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
// ここにValidationルールを記載
return [
'hogeInput' => 'required',
];
}
public function messages()
{
return [
'hogeInput.required' => 'ほげ入力は必須項目です。',
];
}
}
###エラーメッセージのフォーマットを変更したい
これがいちばん苦戦した。
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class CreateHogeRequest extends Request
{
// リダイレクト先
protected $redirect = 'hoge/create';
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; // ひとまずこれをtrueにすると使える
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
// ここにValidationルールを記載
return [
'hogeInput' => 'required',
];
}
public function messages()
{
return [
'hogeInput.required' => 'ほげ入力は必須項目です。',
];
}
/**
* {@inheritdoc}
*/
protected function formatErrors(Validator $validator)
{
$validator->errors()->add('error_option','hogehoge');
return $validator->errors()->all();
}
}
Illuminate\Contracts\Validation\Validatorを読み込むのだが、
5.0まではIlluminate\Validation\Validatorを読み込むとなっているので、注意が必要。
Declaration of App\Http\Requests\CreateHogeRequest::formatErrors() should be compatible with Illuminate\Foundation\Http\FormRequest::formatErrors(Illuminate\Contracts\Validation\Validator $validator)
古い方のドキュメントに従うとこのようなエラーが出る。
###エラー時にリダイレクトするときにwithでなにか変数を持たせたい
そんなときはresponseメソッドをオーバーライトすればよい。
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class CreateHogeRequest extends Request
{
// リダイレクト先
protected $redirect = 'hoge/create';
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; // ひとまずこれをtrueにすると使える
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
// ここにValidationルールを記載
return [
'hogeInput' => 'required',
];
}
public function messages()
{
return [
'hogeInput.required' => 'ほげ入力は必須項目です。',
];
}
/**
* {@inheritdoc}
*/
protected function formatErrors(Validator $validator)
{
$validator->errors()->add('error_option','hogehoge');
return $validator->errors()->all();
}
/**
* リダイレクトの処理をカスタマイズするにはここ
*/
public function response(array $errors)
{
if ($this->ajax() || $this->wantsJson()) {
return new JsonResponse($errors, 422);
}
return $this->redirector->to($this->getRedirectUrl())
->withInput($this->except($this->dontFlash))
->withErrors($errors, $this->errorBag)
->with('hoge_session','session_message');
}
}
sometimesの使い方も知りたかったけど、それはまた今度調べる。