代码之家  ›  专栏  ›  技术社区  ›  Brainmaniac

如何将自定义validaton规则添加到默认Validator::make($data…register in laravel?

  •  2
  • Brainmaniac  · 技术社区  · 7 年前

    我在文档中阅读了如何创建 new custom validation rule .

    我已经做了一个类似的例子,但只允许小写。该类被创造性地命名为 .

    现在我想把它添加到从生成的RegisterController中的验证器列表中制造商:auth。这是我要添加到的列表:

    return Validator::make($data, [
            'name' => 'required|string|max:255|**ADD MY VALIDATOR HERE**',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ]);
    

    很明显,这里有些东西我遗漏了。。。在文档中,我这样做过:

    $request->validate([
    'name' => ['required', 'string', new Lowercase],
    ]);
    

    我需要做什么才能将自定义规则添加到上面的列表中?

    编辑1:

    每个请求我都会显示我创建的规则。它与文档中链接示例中的名称相同,但我已将它的名称从 小写字母

    public function passes($attribute, $value)
    {
        return strtolower($value) === $value;
    }
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Brainmaniac    7 年前

    你有几个选择。一种是用工匠来制定规则

    php artisan make:rule Lowercase
    

    你会得到app\rules\小写.php你想让它看起来像这样

    <?php
    
    namespace App\Rules;
    
    use Auth;
    use Illuminate\Contracts\Validation\Rule;
    
    class Lowercase implements Rule
    {
        /**
         * Create a new rule instance.
         *
         * @return void
         */
        public function __construct()
        {
        }
    
        /**
         * Determine if the validation rule passes.
         *
         * @param  string  $attribute
         * @param  mixed  $value
         * @return bool
         */
        public function passes($attribute, $value)
        {
            return strtolower($value) === $value;
        }
    
        /**
         * Get the validation error message.
         *
         * @return string
         */
        public function message()
        {
            return 'Must be lowercase!';
        }
    }
    

    一旦定义了规则,您可以通过将规则对象的实例与其他验证规则一起传递来将其附加到验证程序:

    所以在你的注册控制器里

    use App\Rules\Lowercase;
    
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255', new Lowercase],
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:6|confirmed',
    ]);
    

    第二种选择是使用闭包,而不必费心与artisan一起创建自定义规则。如果你真的不需要在其他地方使用这个规则,那么这个方法很有效。

    因此,在RegisterController中,可以执行以下操作:

    return Validator::make($data, [
         'name' => [
             'required',
             'max:255',
             function ($attribute, $value, $fail) {
                 if (strtolower($value) != $value) {
                     $fail($attribute.' must be all lowercase.');
                 }
             },
         ],
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:6|confirmed',
    ]);
    
        2
  •  1
  •   syam    7 年前
    $request->validate([
        'name' => ['required','string', 'max:255', 'new MyNewRuleClass(or Uppercase)'],
        'email' => ['required', 'string','email','max:255','unique:users'],
        'password' => ['required','string','min:6','confirmed'],
    ]);
    

    希望这对你有帮助。