laravelのvalidateサンプル
日々Webアプリを開発していますが、フォーム入力とバリデートはどのフレームワークを使用しても書いています。
最近はlaravelを使用することが多く、validate周りでの記事を書いてみます。
validate
laravelのvalidate
public function store(Request $request){ $request->validate([ // <-- ここがバリデーション部分 'name' => 'required', 'birthday' => 'required', 'sex' => 'required', ]); $this->store(); }
validateの条件に引っかかった場合は、直前の画面へ自動でリダイレクトがかかります。エラーの表示内容は、入力画面のviewにエラー表示用のコードを記述する必要があります。
では、受信リクエストフィールドが指定したバリデーションルールにパスしない場合はどうなるでしょうか。前述のように、Laravelはユーザーを直前の場所へ自動的にリダイレクトします。さらに、すべてのバリデーションエラーとリクエスト入力は自動的にセッションに一時保持保存されます。
viewでの表示
<input id="name" type="text" name="name" class="@error('name') is-invalid @enderror"> @error('name') <div class="alert alert-danger">{{ $message }}</div> @enderror
エラーがある場合にエラーメッセージを表示するようになります。実際に使う場合はフォームに入力した内容を表示したほうがいいため、inputフォームのvalueに$request->oldの値を入れています。
また複数の条件を指定する場合は「|」で区切るか配列にすると複数条件でvalidateを設定できます。
public function store(Request $request){ $request->validate([ // <-- ここがバリデーション部分 'price' => 'required|numeric', ]); $request->validate([ // <-- ここがバリデーション部分 'price' => ['required', 'numeric'], ]); $this->store(); }
いくつかvalidateのユースケースを書いていきます。
testコード
namespace Tests\Feature; use Tests\TestCase; class ValidateTest extends TestCase { /** * A basic test example. * * @return void */ public function test_required() { $response = $this->post('/validate/required', [ 'name' => "test" ]); $response->assertStatus(200); $response = $this->post('/validate/required', [ 'name' => "" ]); $response->assertStatus(302); } }
validateの場合,302になるのを利用して、testを実行します。ちゃんとやるならvalidateの内容まで取得する必要はありそうですが、今回はできることを優先します。
validateサンプル
必須
$request->validate([ 'name' => 'required', ]);
数字
$request->validate([ 'price' => 'numeric', ]);
選択肢
use Illuminate\Validation\Rule; $request->validate([ 'sex' => Rule::in([1, 2]), ]);
ファイル(画像)
$request->validate([ 'image' => 'mimes:jpg,png', ]);
imageのvalidateもありますが、範囲が広かったのでmimetypeにしました。
まとめ
一般的なvalidateから書いてみました。
validateで困ることが最近多くなったので、記録しながら機能追加をしていこうと思うので、まずは基礎的な部分からの記述です。
PHPStormでtestコードを実行しようと設定をしていたのですが、docker-composeを利用したinterpreterがうまく設定できずかなりの時間を使ってしまいました。結局設定できなかったので、terminalでphpunitコマンドを実行してテストを実行していきます。
m1チップの影響かな。docker-compose.ymlの書き方が悪いなら直したいけど、docker自体は動作しているので深く調べるのはやめておきます。
少しずつ追加していけたらと思っています。