Laravel自定义验证 - 获取参数

11

我想获取在验证规则中传递的参数。

对于我创建的某些验证规则,我可以从验证规则中获取参数,但对于一些规则,无法获取参数。

在模型中,我使用以下代码:

public static $rules_sponsor_event_check = array(
    'sponsor_id' => 'required',
    'event_id' => 'required|event_sponsor:sponsor_id'
);

在 ValidatorServiceProvider 中,我正在使用以下代码:

    Validator::extend('event_sponsor', function ($attribute, $value, $parameters) {
        $sponsor_id = Input::get($parameters[0]);
        $event_sponsor = EventSponsor::whereIdAndEventId($sponsor_id, $value)->count();

        if ($event_sponsor == 0) {
            return false;
        } else {
            return true;
        }
    });

但是在这里,我无法使用以下方法获取赞助商ID:

$sponsor_id = Input::get($parameters[0]);

尝试使用 dd($parameters[0]) 来检查参数是否正确传递。 - lukasgeiter
dd($parameters[0]) 显示为 "sponsor_id"。 - Rajesh Kumar
2个回答

20
作为第四个参数,整个验证器被传递到您使用extends定义的闭包中。您可以使用它来获取所有已验证的数据:
Validator::extend('event_sponsor', function ($attribute, $value, $parameters, $validator) {
    $sponsor_id = array_get($validator->getData(), $parameters[0], null);
    // ...
});

顺便提一句,在这里我使用array_get 来避免传入的输入名称不存在时出错。


1
我使用以下代码但返回null - $sponsor_id = array_get($validator->getData(), $parameters[0], null); dd($sponsor_id); - 我需要将$validator传递给以下代码吗 - $validator = Validator::make($input, EventSponsor::$rules_sponsor_event_check); - Rajesh Kumar
请检查 $validator->getData() 实际返回了什么。 - lukasgeiter
@lukasgeiter,我该如何在验证消息中设置/访问“:other”? - bmatovu

0

http://laravel.com/docs/5.0/validation#custom-validation-rules

自定义验证器 Closure 接收三个参数:正在验证的 $attribute 名称、属性的 $value 值和传递给规则的 $parameters 数组。
那么为什么要使用 Input::get( $parameters ); 呢?你应该检查 $parameters 的内容。
编辑。 好的,我明白你想做什么了。如果没有提交要获取的值,你不会从输入中读取任何内容。请看一下
dd(Input::all());

然后你会发现

sponsor_id=Input::get($parameters[0]);

在提交了 sponsor_id 的地方正在工作。


参数保存了另一个输入参数的名称。操作员希望获取该值。 - lukasgeiter
$input = Input::get($parameters); dd($input); 抛出异常 - 在Arr.php的219行中的ErrorException: isset或empty中的非法偏移类型 - Rajesh Kumar
对于 dd(Input::all()); 显示为空数组。我还尝试传递一个虚拟值作为参数,如此 - 'event_id' => 'required|event_sponsor:123',但仍然显示为空数组。 - Rajesh Kumar
输入是读取提交给您请求的内容。这就是输入所做的。 - Ezequiel Moreno
感谢您的快速回复。我在控制器中有这样的代码,其中我正在为$input变量分配值并将其传递给验证器 - $input = array(); $user = $auth->toUser(); $input['event_id'] = $eventId;//用于事件验证的事件ID $input['sponsor_id'] = $sponsorId; //用于赞助商验证的事件ID $input['organizer_id'] = $user->id; $validator = Validator::make($input, EventSponsor::$rules_sponsor_event_check); - Rajesh Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接