【问题标题】:Laravel Custom Form Validation with Conditional Messages带有条件消息的 Laravel 自定义表单验证
【发布时间】:2015-11-29 15:17:32
【问题描述】:

我正在使用购物车构建基于 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 中使用条件错误消息完成此类自定义验证,是否有更好或更优雅的解决方案?

【问题讨论】:

  • 我正在使用表单请求验证。我在新的表单请求中有我的新 getValidatorInstance 方法。
  • 注入仅在框架使用服务容器执行代码时起作用。显然,控制器中的每个方法都会如您所知。但它并没有改变整个 php 行为,因此您可以在任何地方注入。您需要阅读Custom Validation Rules 部分来创建自定义验证。
  • 您能否举例说明您提交验证的数据,以及您对该数据的期望。

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


【解决方案1】:

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

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

其中 :attribute 将替换为字段的实际名称。

您也可以只为特定属性提供验证,如下所示

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

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 2016-10-25
    • 2014-05-31
    • 2017-06-28
    • 2017-12-13
    • 2015-10-02
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多