【发布时间】: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;
}
我有几个问题:
-
当我第一次尝试这个解决方案时,我尝试对闭包内的 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 来解决这个问题,但它显然没有那么优雅。为什么方法注入在这里不起作用?
对于如何在 Laravel 中使用条件错误消息完成此类自定义验证,是否有更好或更优雅的解决方案?
【问题讨论】:
-
我正在使用表单请求验证。我在新的表单请求中有我的新 getValidatorInstance 方法。
-
注入仅在框架使用服务容器执行代码时起作用。显然,控制器中的每个方法都会如您所知。但它并没有改变整个 php 行为,因此您可以在任何地方注入。您需要阅读
Custom Validation Rules部分来创建自定义验证。 -
您能否举例说明您提交验证的数据,以及您对该数据的期望。
标签: php validation laravel dependency-injection laravel-5.1