Laravel7 カスタムバリデーションにリクエストパラメータの渡し方

カスタムバリデーションを作成する時に、postされた複数のパラメータを組み合わせて入力チェックしたい時があり、リクエストパラメータをカスタムバリデーションに渡す方法。

リクエストクラスにプライベート変数を宣言

カスタムバリデーションで使用したい変数をプライベート変数として宣言する。

例)postされたval1,val2,val3をカスタムバリデーションで使用したい場合

xxxxRequest.php
    private $val1;
    private $val2;
    private $val3;

リクエストクラスにallメソッドを追加

xxxxRequest.php
    public function all($keys = null)
    {
        $results = parent::all($keys);

        $this->val1 = $results['val1'];
        $this->val2 = $results['val2'];
        $this->val3 = $results['val3'];

        return $results;
    }

$results = parent::all($keys);により、$resultにpostされたパラメータが格納されるので
カスタムバリデーションで使用したいパラメータを取り出しプライベート変数に格納する。

カスタムバリデーションのコンストラクタに変数を渡す

ルールにカスタムバリデーションを指定し、パラメータにpostから取得したプライベート変数を指定

xxxxRequest.php
    public function rules()
    {

        return [
            'val1' => ['required',
                new xxxxRule(
                    $this->val1,
                    $this->val2,
                    $this->val3
                )
            ]
        ];

    }

受け取った変数をプライベート変数に格納

カスタムバリデーション側は、受け取った変数をプライベート変数に格納してバリデートに使用する

xxxxRule.php

    private $val1;
    private $val2;
    private $val3;

    public function __construct($val1, $val2, $val3)
    {
        $this->val1 = $val1;
        $this->val2 = $val2;
        $this->val3 = $val3;
    }
xxxxRule.php
    public function passes($attribute, $value)
    {
        if(($this->val1 == 1) && ($this->val2 == 1) && ($this->val3 == 1)) return true;
        else                                                               return false;
    }

これでOK!

全体ソース

xxxxRequest.php

<?php

namespace App\Http\Requests;
use App\Rules\xxxxRule;

class xxxxRequest extends Request
{
    private $val1;
    private $val2;
    private $val3;

    public function authorize()
    {
        return true;
    }

    public function all($keys = null)
    {
        $results = parent::all($keys);

        $this->val1 = $results['val1'];
        $this->val2 = $results['val2'];
        $this->val3 = $results['val3'];

        return $results;
    }

    public function rules()
    {

        return [
            'val1' => ['required',
                new xxxxRule(
                    $this->val1,
                    $this->val2,
                    $this->val3
                )
            ],
        ];

    }

    public function attributes()
    {
        return [
        ];
    }

}

xxxxRule.php

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class xxxxRule implements Rule
{
    private $val1;
    private $val2;
    private $val3;

    public function __construct($val1, $val2, $val3)
    {
        $this->val1 = $val1;
        $this->val2 = $val2;
        $this->val3 = $val3;
    }

    public function passes($attribute, $value)
    {
        if(($this->val1 == 1) && ($this->val2 == 1) && ($this->val3 == 1)) return true;
        else                                                               return false;
    }

}

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です