どうしてもコントローラ側でバリデーションエラーを制御したかったときに実装した内容を備忘録として残します。
バージョン
Laravel Framework 5.5.45
PHP 7.2.25
やったこと
failedValidation を override して、Handlerに飛ばないようにします。
getValidatorを実装して、インスタンスを返せるようにします。
GetIndexRequest.php
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
class GetIndexRequest extends FormRequest
{
/**
* リクエストに適用するバリデーションルールを取得
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|max:255',
'body' => 'required',
];
}
/**
* 定義済みバリデーションルールのエラーメッセージ取得
*
* @return array
*/
public function messages()
{
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}
/**
* @param Validator $validator
*/
protected function failedValidation(Validator $validator)
{
}
/**
* @return Validator $validator
*/
public function getValidator()
{
return $this->getValidatorInstance();
}
}
Controller側で受け取ってみます。
HogeController.php
public function find(GetIndexRequest $request)
{
$validator = $request->getValidator();
if ($validator->fails()) {
// エラーが表示される
echo $validator->getMessageBag()->first();
}
}