【Laravel5.6】カスタムバリデーションはルールオブジェクトを使おう
こんにちは。
ニシザワです。
Laravelのカスタムバリデーションはどうしていますか?
Validation Classを拡張する方法もありますが、Laravelが推奨しているルールオブジェクトを使うとシンプルに書けます。
今回はルールオブジェクトを説明します。
まずは、コンソールで下記を打ちます。
では今回は、複数カラムからなる入力値の合計が100までというカスタムバリデーションを書いてみます。
後はFormRequestなどで下記の様に記載すればOKです。
ぜひ利用してみてください。
ニシザワです。
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())
],
];
バリデーションロジックをファイルごとに分けることで、何があるかがわかりやすくなるのがいいですね。ぜひ利用してみてください。