Controllerからvalidation処理をコード分離し、よりシンプルな構成にするための仕組み。
実装方法
事前にphp artisanコマンドでFormRequestを作成
php artisan make:request HogePostRequest
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class HogePostRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
・authorize()メソッド
初期状態ではreturn false;となるが、認証の有無をチェックしないのであればreturn true;で良い。
true:認証成功
false:認証失敗(403エラーを表示)
~抜粋~
public function authorize()
{
return true;
}
~抜粋~
rules()メソッド
リクエストのパラメータごとにルールを設定する。
使用可能なルールについては定義さているのでそちらを参照。
9.x バリデーション Laravel
~抜粋~
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required',
'age' => 'integer | between:18,120',
'sex' => ['max:2', 'regex:/^[男|女|指定なし]+$/u'],
];
}
・Controller側の対応
Controllerの作成方法はこちらを参照
★変更前のController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HogeController extends Controller
{
// SingleActionControllerでは__invokeで作成する
public function __invoke ()
{
$hello = 'Hello,World!';
return view('hoge', compact('hello'));
}
}
★変更後のController
変更点はFormRquestをuseに追加、__invokeメソッドの引数追加
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\HogePostRequest;
class HogeController extends Controller
{
// SingleActionControllerでは__invokeで作成する
public function __invoke (HogePostRequest $request)
{
$hello = 'Hello,World!';
return view('hoge', compact('hello'));
}
}
ここまで設定することで、Controllerが呼び出される前にバリデーションチェックが実施される。
さいごに
FatになりがちなControllerをよりシンプルにする方法は他にもあります。
ぜひこちらも試してみてください。
コメント