我正在使用购物车构建基于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中使用条件错误消息完成此类自定义验证?
答案 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!',];