Laravel 学習記録 #012 バリデーションを学ぶ
Laravelのバリデーションについて学習したものをまとめてます。
バリデーションについて
入力データを簡単に検証し、エラーがあればエラーメッセージを提供する仕組み
バリデーションルールが用意されている
独自でバリデーションルールを作ることもできる
バリデーションに失敗するとIlluminate\Validation\ValidationException例外がスローされ、自動的にエラーレスポンスが生成
バリデーションを使ってみる
バリデーションを実装するには以下のいずれかの方法を使う
Illuminate\Http\Requestオブジェクトが提供するvalidateメソッド
Validatorファサード
フォームリクエスト
マニュアルでは
とありますが、ファットコントローラーになりそうなので、
フォームリクエストtが一番いいのではないでしょうか?
ベストプラクティスでも
バリデーションはコントローラからリクエストクラスに移動されてます。
https://github.com/alexeymezenin/laravel-best-practices/blob/master/japanese.md#バリデーション
と言うことで
フォームリクエストを使ったバリデーション方法について学習しました。
今回は基本ルールを設定する方法でやります。
フォームリクエストクラスを作成
まずは、専用のクラスを作成します。
php artisan make:request <ファイル名>
でapp/Http/Requests配下に
StorePostRequest.phpを作成
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
*/
public function rules(): array
{
return [
//
];
}
}
authorize メソッド:認可についての設定 false を返すと、Laravelは403 Forbidden エラーを発生させるため、認可が関係なければtrueを設定
rulesメソッド:バリデーション内容を記述する
バリデーション内容を記述
titleというname属性に対して必須と文字数のバリデーションをする場合
public function rules(): array
{
return [
'title' => 'required|max:10',
];
}
とします。
複数ある場合は、左から順に実行されて、エラーがある時点で前ページへ戻ります。
ただ、このままだとメッセージが英語だったり、name属性がそのまま表示されたりするので修正が必要です。
メッセージを定義
フォームリクエストのクラス(StorePostRequest)に下記を追加
public function attributes(): array
{
return [
'title' => 'タイトル',
];
}
public function messages(): array
{
return [
// 'name属性.ルール' => '返すテキスト',
'title.required' => ':attributeは必須です。',
'title.max' => ':attributeは10文字以内で入力してください。',
];
}
attributesメソッド:name属性に対しての命名を設定
messagesメソッド:name属性.ルールとして、返すメッセージを設定(name属性を埋め込むには:attributeを使う)
コントローラーでフォームリクエストを呼び出す
ではコントローラーで作成したフォームリクエストを使っていきましょう。
使い方は簡単で、アクションの引数にタイプヒントで設定するだけです。
public function メソッド(フォームリクエストクラス $変数)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\StorePostRequest;
class ValidateController extends Controller
{
public function index()
{
return view('form');
}
public function store(StorePostRequest $request)
{
dd($request);
}
}
確認できるようにviewを作成しておきます。
<form action="store" method="post">
@csrf
タイトル:<input type="text" name="title">
<input type="submit" value="送信">
</form>
@if ($errors->any())
<div>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
画面で空文字または、文字数超過でフォームを送信すると
画面にエラーメッセージが表示されます。
(バリデーションに失敗すると$errorsにエラーメッセージが格納されます。)
バリデーション通過するように入力した場合ddメソッドでリクエストの内容が確認できます。
このようにフォームリクエストで用意した場合
コントローラーアクションの処理が実行される前にバリデーションが済んでいることになるので、スッキリしますね。
この記事が気に入ったらサポートをしてみませんか?