首页 > 解决方案 > 如何在 Laravel Rule 中传递参数?

问题描述

我想将此代码移至 App\Rule:

//Currently in class AppServiceProvider extends ServiceProvider

Validator::extend('empty_if', function ($attribute, $value, $parameters, $validator) {
   return ($value != '' && request($parameters[0]) != '') ? false : true;
});

所以它应该是这样的:

//in: App\Rules\EmptyIf

public function passes($attribute, $value, $parameters)
{
   return ($value != '' && request($parameters[0]) != '') ? false : true;
}

但我的问题是,我不能通过 $parameters

Validator::extend('empty_if', 'App\Rules\EmptyIf@passes');

你将如何将参数传递给 Laravel Rule?

标签: laravel

解决方案


这是一种更简单且更新的方法来完成此操作,而无需扩展验证器。您可以在 Rule 的构造函数中访问传递的参数,因此只需设置一个全局范围的变量,现在您可以在 pass() 方法中引用它。您甚至可以使用相同的方法在验证器消息中获取值。

验证调用:

case 'measurement':
 $request->validate([
   'updates.*.value' => [
   new Measurement('foo-bar'),
   ],
 ]);
 break;

规则:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Measurement implements Rule
{
/**
 * Create a new rule instance.
 *
 * @param $param
 */
public function __construct($param)
{
    $this->type = $param;
}

public $type;
/**
 * Determine if the validation rule passes.
 *
 * @param string $attribute
 * @param mixed $value
 * @param array $parameters
 * @return bool
 */
public function passes($attribute, $value)
{
    dd($this->type, 'params');
    return;
}

推荐阅读