開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. 【Laravel5.6】カスタムバリデーションはルールオブジェクトを使おう

【Laravel5.6】カスタムバリデーションはルールオブジェクトを使おう

こんにちは。
ニシザワです。

Laravelのカスタムバリデーションはどうしていますか?
Validation Classを拡張する方法もありますが、Laravelが推奨しているルールオブジェクトを使うとシンプルに書けます。
今回はルールオブジェクトを説明します。

まずは、コンソールで下記を打ちます。

    php artisan make:rule PercentSum
これで、app/Rules/PercentSum.phpというファイルができたと思います。
では今回は、複数カラムからなる入力値の合計が100までというカスタムバリデーションを書いてみます。
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class PercentSum implements Rule
{

    /**
     * @var array
     */
    protected $attributes = [];

    /**
     * PercentSum constructor.
     * @param array $attributes
     */
    public function __construct(array $attributes)
    {
        $this->attributes = $attributes;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $percentSum = 0;
        foreach ($this->attributes as $attribute){
            $percentSum += intval(array_get($attribute, "percent", 0));
        }
        return ($percentSum >= 0 && $percentSum <= 100);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return ':attributeは合計で0から100で設定してください。';
    }
}

ポイントは他のデータを扱いたいときはコンストラクタで引数に取ることです。
後はFormRequestなどで下記の様に記載すればOKです。
<?php
$rules = [
        'statement.staff_sales.*.percent' => [
                'integer',
                'max:100',
                'nullable',
                new PercentSum($this->request->all())
            ],
        ];
バリデーションロジックをファイルごとに分けることで、何があるかがわかりやすくなるのがいいですね。
ぜひ利用してみてください。
TOPに戻る