0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Laravel】コントローラーにバリデーションを直書きする方法

0
Last updated at Posted at 2026-05-24

バリデーションをやってみたい

でもいきなりバリデーション用のファイルをつくるのは初学者には難しい
とりあえずコントローラーに直書きでいいからバリデーションをやってみたい

そんな人向けの例文

前提

.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'),
    ]);
}

ちょっとした流れの解説

  1. Bladeのformがsubmitされる

  2. form内のinputのname/valueがHTTPリクエストとして送信される

  3. LaravelがRequestオブジェクトを生成し、
    送信データを内部に保持する
    (連想配列のように扱える形になる)

  4. LaravelがそのRequestインスタンスをControllerの
    $request引数へ自動注入する

  5. 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>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?