カスタムバリデーションを作成する時に、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;
}
}