Php 转义Laravel验证规则

Php 转义Laravel验证规则,php,validation,laravel,Php,Validation,Laravel,我有一个用户可配置的下拉列表,用户可以在其中填充自己的选项列表。我想用:foo,bar中的类验证规则来验证它 不幸的是,这意味着有些人会选择“是的,我愿意”。如果我将一个内爆的下拉选项列表传递给验证规则,这显然会破坏验证 有没有可能逃脱Laravel的规则来避免这个问题?验证程序类使用PHP来解析规则的属性。过程大致如下: 使用管道分隔符(Validator::explodeRules())分解所有规则 使用:冒号分隔符(Validator::parseRule())分解规则名称和参数 通过s

我有一个用户可配置的下拉列表,用户可以在其中填充自己的选项列表。我想用:foo,bar中的
类验证规则来验证它

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


有没有可能逃脱Laravel的规则来避免这个问题?

验证程序类使用PHP来解析规则的属性。过程大致如下:

  • 使用管道分隔符(
    Validator::explodeRules()
    )分解所有规则
  • 使用
    冒号分隔符(
    Validator::parseRule()
    )分解规则名称和参数
  • 通过
    str\u getcsv()
    Validator::parseParameters()
    )发送属性
这使您能够以与CSV文件相同的方式在:
中定义
选项列表,每列都用引号括起来!下面是一个例子:

$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类。如果你想要更强大的东西,没有必要只使用“股票”开箱即用的期权

正如克莱罗德在回答中所说,拉威尔将允许的值解码为CSV。下面是一个助手方法,您可以使用它从字符串数组生成这个CSV编码的字符串,而不用担心手动转义

<?php

class ValidatorHelper {

    /*
     * Get an "in" rule from a list of allowed strings
     *
     * @param array $allowed Array of allowed strings, unescaped
     * @return string In rule starting 'in:' with the allowed strings properly 
     * escaped
     */
    public static function inRule(array $allowed) {
        // Laravel separates options via CSV, so we can encode as CSV and not 
        // worry about quotes and commas in the options
        $fp = fopen('php://temp', 'r+');
        fputcsv($fp, $allowed);
        rewind($fp);
        $csv = fgets($fp);
        fclose($fp);
        return 'in:' . $csv;
    }

}

这假设你是基于逗号内爆的,对吗?你能给他们一个文本区域并在换行符上内爆吗?(所以每行一项)@fideloper I将使用逗号内爆,因为Laravel在
规则中的
需要一个逗号分隔的值列表。Textarea没有帮助,因为用户仍然可以在其中一行中键入逗号。为什么不在放入验证规则之前删除任何逗号?您不能用反斜杠转义逗号吗?如果没有,可以用字符串替换用户输入中的逗号(如
[comma]
),然后在检查验证时也这样做?我更喜欢一个更整洁的解决方案,但如果你发布了,我会给它一个+1,如果没有更好的解决方案,我会接受。谢谢
$validator = new Validator(Input::all(), [
    'flavour' => [
        'required',
        ValidatorHelper::inRule([
            "mint choc chip",
            "rum and raisin",
            "orange, peach and pineapple",
        ]),
    ],
]);