日々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自体は動作しているので深く調べるのはやめておきます。
少しずつ追加していけたらと思っています。