2013-10-24 185 views
0

我有一个用户可配置的下拉列表,用户可以用它们自己的选项列表填充它。我想用in:foo,bar验证规则来验证它。转义Laravel验证规则

不幸的是,这意味着有些人会选择“是的,我愿意”。如果我将下拉选项的分解列表传递给验证规则,这显然会打破验证。

是否有可能摆脱Laravel的规则来避免这个问题?

+0

这是假设您是根据逗号爆,是否正确?你可以给他们一个textarea和内行换行字符吗? (所以每行一个项目) – fideloper

+0

@fideloper因为Laravel的'in'规则需要用逗号分隔的值列表,所以我会用逗号内插。 Textarea没有帮助,因为用户仍然可以在其中一行中输入逗号。 – ceejayoz

+0

为什么不在输入验证规则之前删除任何逗号? – itachi

回答

8

Validator类利用PHP的str_getcsv()来解析规则的属性。该过程进行是这样的:使用|竖线分隔符(Validator::explodeRules()

    • 爆炸的所有规则爆炸规则的名称,并使用:冒号分隔符(Validator::parseRule()
    • 通过str_getcsv()发送的属性参数(Validator::parseParameters()

    这使您能够像CSV文件一样定义In:选项的列表 - 每列都有引号!例如:

    $input = ['foo' => 'Hello, world!']; 
    
    // Note the formatting of the `in:` options 
    $rules = ['foo' => 'required|in:"StackOverflow","Laravel","Hello, world!"',]; 
    
    $v = Validator::make($input, $rules); 
    
    var_dump($v->passes()); // true 
    

    另外,请记住,像大多数事情Laravel一样,您可以以任何适合您的应用程序的方式扩展Validator类。如果你想要更强大的功能,就不需要坚持“库存”即买即用的选择。 :)

  • +0

    呜呼!这很完美,谢谢。 – ceejayoz

    1

    正如Cryode在他的回答中所说,Laravel将允许的值解码为CSV。这里有一个帮助方法可以用来从一个字符串数组中产生这个CSV编码的字符串,而不用担心手动转义的东西。

    使用方法如下:

    $validator = new Validator(Input::all(), [ 
        'flavour' => [ 
         'required', 
         ValidatorHelper::inRule([ 
          "mint choc chip", 
          "rum and raisin", 
          "orange, peach and pineapple", 
         ]), 
        ], 
    ]);