#Laravelでリクエストパラメータのバリデーションを実装します
Laravelのベストプラクティスとしてスリムコントローラーが推奨されていますので、
コントローラーでリクエストパラメータのチェックを行うのではなく、バリデーションを利用した方が良いと考えています。
例としてメールアドレスとパスワードを入力するログイン画面におけるバリデーションのケースで考えてみましょう
#Requestオブジェクトが提供するvalidateメソッドを使用するケース
Illuminate\Http\Requestオブジェクトが提供する、validateメソッドを使って簡単にバリデーションを実装することができます。
次のコードはリクエストパラメータのmail(メールアドレス)とpassword(パスワード)の必須チェックです。
class LoginController extends Controller
{
public function login(Request $request)
{
$request->validate([
'mail' => 'required',
'password' => 'required',
]);
}
}
バリデーションエラーになった場合は遷移元にリダイレクトしてくれます。
エラーメッセージはビューの中で$errors変数に格納されているため次のように表示します。
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
表示されるメッセージの内容に関しては言語ごとのvalidation.phpに定義されています。
例えば英語の場合requiredはこのように定義されています。
'required' => 'The :attribute field is required.',
:attributeの所にパラメータの名前がプロットされます。
The mail field is required.
のように表示されることになります。
パラメータの名称を定義する場合は同じファイル内に定義されている
'attributes' => [],に追記します。
'attributes' => [
'mail' => 'mail address'
],
このようにすることで、
The mail address field is required.
と表示させることが可能です。
##フォームリクエストバリデーションを使用するケース
より複雑なバリデーションを実装することができます。
個別にエラーメッセージ、リクエストパラメータの名称を定義することができます。
まずは次のコマンドでRequestクラスを生成しましょう。
php artisan make:request LoginRequest
App\Http\Requests\LoginRequestが生成されます。
class LoginRequest 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()
{
// ここにバリデーションルールを記述してください
return [
'mail' => 'required|email|exists:users,mail',
'password' => 'required',
];
}
public function attributes()
{
// attributesメソッドをオーバーライドすることでリクエストパラメータの名称を個別に定義できます
return [
'mail' => 'メールアドレス',
'password' => 'パスワード',
];
}
public function messages()
{
// messagesメソッドをオーバーライドすることでエラーメッセージを個別に定義できます。
return [
'mail.required' => ':attributeは必須です',
'mail.email' => ':attributeの形式が正しくありません',
'mail.exists' => ':attributeまたはパスワードが正しくありません',
'password.required' => ':attributeが入力されていません',
];
}
}
コントローラーは次のようになります。
use App\Http\Requests\LoginRequest;
class LoginController extends Controller
{
public function login(LoginRequest $request)
{
// バリデーション処理を記述する必要はなく、検証OKの時に通常の処理が実行される
}
}
フォームリクエストバリデーションを使用するとクラスが増えるという面がありますが、
より複雑なバリデーションに対応することができ、コントローラーがすっきりします。
アプリケーションとしてエラーメッセージの形式はなるべく統一しておいた方が実装もシンプルになって良いと思いますが、
状況に応じて使い分けるといいかもしれません。