使用条件消息进行Laravel自定义表单验证

时间:2015-09-03 17:00:43

标签: php validation laravel dependency-injection laravel-5.1

我正在使用购物车构建基于Laravel的电子商务解决方案。我有一个每个产品的页面,您可以在其中选择产品选项,是否要订阅,您希望接收货物的频率,您想要的数量,然后将其添加到您的购物车。我想在添加到客户的购物车之前验证这些选择组合。要进行验证,我需要针对此产品选项检查数据库,以确保可以订阅,所选数量低于该产品允许的最大数量等。

使用CodeIgniter,我会写一个自定义回调,从POST请求中提取输入,并在一次调用数据库时检查所有内容。如果验证失败,我会输出相关的条件消息,说明导致验证失败的原因。 (即“您不能订购该产品”或“您选择的数量超过产品允许的最大数量。”)

使用Laravel这似乎有点难以实现。我在线查看文档和文章,我发现了一种似乎有用的方法。

我的模型中有我的验证方法,CartLine。然后,在新的表单请求中,我用以下内容覆盖getValidatorInstance方法:

public function getValidatorInstance()
{
    $validator = parent::getValidatorInstance();

    $validator->after(function() use ($validator) {

        $cartLine = new CartLine;
        $cartLine->validate($this->all());

        if (!$cartLine->valid()) {
            $validator->errors()->add('product', $cartLine->errors());
        }

    });

    return $validator;
}

我有几个问题:

  1. 当我第一次尝试使用此解决方案时,我尝试在闭包内使用方法注入CarLine实例,如下所示:

    $validator->after(function(Validator $validator, CartLine $cartLine) use ($validator) {
    
        $cartLine->validate($this->all());
    
        if (!$cartLine->valid()) {
            $validator->errors()->add('product', $cartLine->errors());
        }
    
    });
    

    但是我一直收到一个错误,说关闭是期待CartLine的一个实例并且没有给出。我通过在封闭内部新建CartLine来解决这个问题,但它显然不那么优雅。为什么方法注入不起作用?

  2. 是否有人有更好或更优雅的解决方案,如何在Laravel中使用条件错误消息完成此类自定义验证?

1 个答案:

答案 0 :(得分:1)

您可以将自定义消息作为第三个参数传递给Validator :: make方法:

$messages = [
'required' => 'The :attribute field is required.',];
 $validator = Validator::make($input, $rules, $messages);

其中:属性将被实际的字段名称替换。

此外,您只能为特定属性提供验证,如下所示

$messages = [
'email.required' => 'We need to know your e-mail address!',];