ホーム > カテゴリ > PHP・Laravel・CakePHP >

フォームリクエストの使い方 [Laravel]

Laravelの「フォームリクエスト」はバリデーションの処理を専門に行います。コントローラーとバリデーションの処理を切り分けたい際に使用します。

前提条件

// コントローラー
・app\Http\Controllers\Answer(s)Controller.php
// ビュー
・resources\views\answers\index.blade.php

があるものとします。※(s)は現場によって単数形、複数形が異なる。

1. フォームリクエスト

1-1. フォームリクエストのファイルを生成する

php artisan make:request HelloRequest

app\Http\Requests\HelloRequest.phpが作成される。

1-2. HelloRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class HelloRequest extends FormRequest
{
    public function authorize()
    {
        // 一致するパスのみバリデーションを実行する
        if ($this->path() == 'answers')
        {
            return true;
        } else {
            return false;
        }
    }

    public function rules()
    {
        return [
          'name'  => 'required|max:50',
          'url'   => 'nullable|url|max:250', 
          'body'  => 'required'
        ];
    }

    public function messages()
    {
        return [
            'name.required' => '名前は必ず入力して下さい。',
            'url.url' => 'ホームページに正しい形式を指定してください。',     
            'body.required' => '本文は必ず入力して下さい。',
        ];
    }    
}

messages()でエラーメッセージを設定できるが、validation.phpを利用した方が良い。 エラーメッセージの日本語化 (validation.php)を参照。

1-3. コントローラー

storeの引数がRequestではなくHelloRequestになっている事を確認。

// 追加分
use App\Http\Requests\HelloRequest;

public function store(HelloRequest $request)   
{
  // なんらかの保存処理  
}

これだけでフォームリクエストによるバリデーションは完了です。

エラーがない場合はコントローラーの「何らかの保存処理」へ進み、エラーがある場合は自動的に前画面に戻って$errorsにエラー内容が設定されます。

2. おすすめのやり方

モデルでルールを定義する手法です。Ruby on Railsと同じです。

2-1. モデル

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

// 追加分
use App\Rules\NgWord;

class Answer extends Model
{
   protected $guarded = array('id');   
     
   public static function Rules()
   {
      return [
          'name'  => ['required','max:50', new NgWord('name')],
          'url'   => 'nullable|url|max:250', 
          'body'  => ['required', new NgWord('body')]
          ];
   }
}

NgWordはカスタムバリデーションルールです。カスタムバリデーションルールを使用する際は[]で配列にする必要があります。

2-2. コントローラー

// 追加分
use App\Answer;
 
public function store(Request $request)
{
    // バリデーション
    $request->validate(Answer::Rules());  

    // なんらかの保存処理  
}





関連記事



公開日:2020年11月17日
記事NO:02855