@Satoh_D no blog

大分にUターンしたので記念に。調べたこととか作ったこととか食べたこととか

【Laravel】カスタムバリデーションを作成する

最近初めてLaravelの案件をやることになりまして。
ひっさびさのプログラミングということもあってフレームワークの進化に驚くばかり...。

Laravelはバリデーション周りがデフォルトで充実してていいですね。
しかし、デフォルトでは実装できないバリデーションの要件があったので、
勉強がてらカスタムバリデーションを実装してみました。

前提

  • PHP7.0
  • Laravel 5.5.x

1. カスタムバリデーションルールを作成する

php artisanで雛形を作成する

$ php artisan make:rule HogeCustomRule

/app/Rules/HogeCusomRule.phpが出来上がる

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class HogeRule implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        //
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The validation error message.';
    }
}

バリデーションルールはpasses()に記載する
戻り値はboolになるよう処理を書くこと
falseのときにmessage()に記載したエラーメッセージが表示される

public function passes($attribute, $value)
{
    if($value % 2 == 0) {
      return true;
    }
}

public function message()
{
    return ':attributeは偶数で入力してください';
}

2. フォームリクエストを作成する

php artisanで雛形を作成する

$ php artisan make:request HogeRequest

/app/Http/Requests/HogeRequest.phpが出来上がる

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class HogeRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

rules()にバリデーションルールを書いていく
カスタムバリデーションルールはuseで宣言した後、new HogeRule()で適用する

use App\Rules\HogeRule;

class HogeRequest extends FormRequest
{
  ...
  
  public function rules()
  {
    return [
      'hoge' => 'required', 'integer', new HogeRule()
    ];
  }
}

3. コントローラで利用する

コントローラー内で利用したいアクションの引数の型に先程作成したHogeRequestを利用する
引数に宣言することでアクション実行時にバリデーションチェックを自動的に行なってくれる

use Illuminate\Http\Request;
use App\Http\Requests\HogeRequest;

class HogeController extends Controller
{
  public function index()
  {
    ...
  }
  
  public function store(HogeRequest $request)
  {
    ...
  }
}

やってみて

わりと簡単に実装できるもんですね。
Controllerの引数に指定するだけで自動的にバリデーションチェックをやってくれるのマジ凄い。
最近のフレームワークってこういった挙動がトレンドなんですかね。

参考サイト

PHPフレームワーク Laravel入門

PHPフレームワーク Laravel入門