Laravel 自定义验证消息

Posted

技术标签:

【中文标题】Laravel 自定义验证消息【英文标题】:Laravel custom validation messages 【发布时间】:2014-07-22 16:11:22 【问题描述】:

我正在尝试使用 Laravel 验证英国邮政编码。这是我得到的:

//routes.php
    $rules =  array(
        'pcode' => array('required:|Regex:/^([Gg][Ii][Rr] 0[Aa]2)|((([A-Za-z][0-9]1,2)|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]1,2)|(([A-Za-z][‌​0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]2)$/') 
    );

    $messages = array(
        'required' => 'The :attribute field is required.',
        'pcode' => array('regex', 'Poscode should be a valid UK based entry'),
    );

    $validator = Validator::make(Input::all(), $rules, $messages);

在我的blade

<input id="postcode" name="pcode" value="Input::old('pcode')" type="text" placeholder="Postcode" class="form-control" xequired="" />
    @if( $errors->has('pcode') ) <span class="error" style='background-color: pink;'> $errors->first('pcode') </span> @endif

如果我提交带有空 pcode 字段的表单,它会警告我输入必填字段。如果我输入了一个无效的邮政编码,比如“74rht”,我的验证器将什么都不做或无法显示我上面定义的自定义消息?

【问题讨论】:

【参考方案1】:

Laravel manual 声明:

Note: When using the regex pattern, it may be necessary to specify rules in an array instead of using pipe delimiters, especially if the regular expression contains a pipe character.

$rules改成这个结构:

$rules = array(
    'pcode' => array(
        'required',
        'Regex:/^([Gg][Ii][Rr] 0[Aa]2)|((([A-Za-z][0-9]1,2)|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]1,2)|(([A-Za-z][‌​0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]2)$/'
    ) 
);

如果这不起作用,那么您的正则表达式可能无效,请尝试使用更简单的正则表达式来检查验证器是否有效。

【讨论】:

【参考方案2】:

首先,您需要向验证器注册自定义验证规则。

    Validator::extend('pcode_rule_name', function($attribute, $value)
    
        return preg_match('/^([Gg][Ii][Rr] 0[Aa]2)|((([A-Za-z][0-9]1,2)|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]1,2)|(([A-Za-z][‌​0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]2)$/', $value);
    );

源代码:http://laravel.com/docs/validation#custom-validation-rules

然后你需要在 app/lang/en/validation.php 中指定自定义消息

您会找到为您的规则添加自定义消息的地方

     'custom' => array(
        'attribute-name' => array(
            'rule-name' => 'custom-message',
        ),
     ),

您可以像这样添加规则:

     'custom' => array(
        'pcode' => array(
            'pcode_rule_name' => 'Post Code should be a valid UK based entry',
        ),
     ),

还将有一个数组来命名您的“pcode”字段,因此它将更雄辩地命名为“必需”等规则。

    'attributes' => array(),

只需像这样添加名称

    'attributes' => array(
         'pcode' => 'Postal Code",
    ),

【讨论】:

以上是关于Laravel 自定义验证消息的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 自定义验证消息参数

Laravel 5.3 自定义验证消息数组

Laravel Spark 中的自定义验证消息

laravel api 验证自定义消息

Laravel 自定义验证消息

在 Laravel 中验证数组时,如何使用数组项规则添加验证自定义消息?