バリデーションをやってみたい
でもいきなりバリデーション用のファイルをつくるのは初学者には難しい
とりあえずコントローラーに直書きでいいからバリデーションをやってみたい
そんな人向けの例文
前提
.blade.phpファイルのformからsubmitされてきたものをバリデーションすると仮定して話す。以下のようなものを想像してもらえればと思う。
html
<form action="/store" method="POST">
@csrf
<input type="text" name="item_name">
<input type="text" name="price">
<button type="submit">送信</button>
</form>
パターン1 : バリデーションするだけ
controller.php
public function store(Request $request)
{
$request->validate([
'item_name' => 'required|max:100',
'price' => 'required|integer',
]);
DB::table('m_item')->insert([
'item_name' => $request->input('item_name'),
'price' => $request->input('price'),
]);
}
ちょっとした流れの解説
-
Bladeのformがsubmitされる
-
form内のinputのname/valueがHTTPリクエストとして送信される
-
LaravelがRequestオブジェクトを生成し、
送信データを内部に保持する
(連想配列のように扱える形になる) -
LaravelがそのRequestインスタンスをControllerの
$request引数へ自動注入する -
Requestクラスのvalidate()メソッドで
バリデーションを実行できる
ちょっとしたvalidate()メソッドの解説
validate()より
'item_name' => 'required|max:100'
この左側ですが、ここには先ほど解説した「$requestに収納された、inputのname属性値 (連想配列のkey) 」を用います。
誤った例
$request->input('item_name') => 'required|max:100'
値を直接バリデーションしようと、左側に$request->input('item_name')と書いても上手く動きません。
パターン2 : バリデーション & エラーメッセージ
controller.php
public function store(Request $request)
{
$request->validate(
// ① ルール
[
'name' => 'required|string|max:100',
'price' => 'required|integer|min:0',
],
// ② エラーメッセージ
[
'name.required' => '商品名は必須です',
'name.max' => '商品名は100文字以内です',
'price.required' => '価格は必須です',
'price.integer' => '価格は数値で入力してください',
'price.min' => '価格は0以上です',
]
);
DB::table('products')->insert([
'name' => $request->name,
'price' => $request->price,
]);
}
blade.php
<!-- 商品名 -->
<div class="mb-3">
<label for="name" class="form-label">商品名</label>
<input
type="text"
class="form-control @error('name') is-invalid @enderror"
id="name"
name="name"
value="{{ old('name') }}"
>
@error('name')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<!-- 価格 -->
<div class="mb-3">
<label for="price" class="form-label">価格</label>
<input
type="number"
class="form-control @error('price') is-invalid @enderror"
id="price"
name="price"
value="{{ old('price') }}"
>
@error('price')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
パターン3 : バリデーション & エラーメッセージ & エラーメッセージをテンプレート化
controller.php
$request->validate(
[
'name'=>'required|max:100',
'price'=>'required|integer|min:0',
],
[
'required'=>':attribute は必須です',
'integer'=>':attribute は数字で入力してください',
'min'=>':attribute は0以上です',
],
[
'name'=>'商品名',
'price'=>'価格',
]
);
blade.php
<!-- 商品名 -->
<div class="mb-3">
<label for="name" class="form-label">商品名</label>
<input
type="text"
class="form-control @error('name') is-invalid @enderror"
id="name"
name="name"
value="{{ old('name') }}"
>
@error('name')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<!-- 価格 -->
<div class="mb-3">
<label for="price" class="form-label">価格</label>
<input
type="number"
class="form-control @error('price') is-invalid @enderror"
id="price"
name="price"
value="{{ old('price') }}"
>
@error('price')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>