【问题标题】:escaping Laravel validation rules转义 Laravel 验证规则
【发布时间】:2013-11-03 17:54:54
【问题描述】:

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

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

是否可以绕过 Laravel 的规则来避免这个问题?

【问题讨论】:

  • 这假设您基于逗号内爆,对吗?你能给他们一个文本区域并在换行符上内爆吗? (所以每行一项)
  • @fideloper 我会用逗号分解,因为 Laravel 的 in 规则需要一个逗号分隔的值列表。 Textarea 没有帮助,因为用户仍然可以在其中一行中输入逗号。
  • 为什么不在输入验证规则之前删除任何逗号?
  • 你不能用反斜杠转义逗号吗?如果不是,也许用字符串(如[comma])替换用户输入中的逗号,然后在检查验证时做同样的事情?
  • 我更喜欢更简洁的解决方案,但如果您发布该解决方案,我会给它 +1 并接受如果没有更好的解决方案。谢谢!

标签: php validation laravel


【解决方案1】:

正如 Cryode 在他的回答中所说,Laravel 将允许的值解码为 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;
    }

}

像这样使用它:

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

【讨论】:

    【解决方案2】:

    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 类。如果您想要更强大的功能,则无需坚持仅使用“库存”的开箱即用选项。 :)

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 2018-02-18
      • 1970-01-01
      • 2019-02-12
      • 2016-11-22
      • 2017-12-01
      • 2018-05-25
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多