有没有办法在 Laravel 5 验证规则中为输入名称取别名?

Posted

技术标签:

【中文标题】有没有办法在 Laravel 5 验证规则中为输入名称取别名?【英文标题】:Is there a way to alias input names in the rules for Laravel 5 validation? 【发布时间】:2015-05-12 15:52:40 【问题描述】:

我喜欢 Laravel 5 中的功能,它让我将验证逻辑放入 Laravel 5 的表单请求之一,然后运行 ​​Laravel will automatically validate it just before 我的控制器的方法。但是,缺少的一件事是“别名”输入名称的简单方法。

例如(为简单起见),假设我有一个登录表单,其中包含一个名为“用户名”的输入字段,但它实际上接受了一个电子邮件地址。我的表单上的标签是 Email。如果出现错误,错误将显示类似“需要用户名”的内容。这很令人困惑,因为我在表单上将该字段标记为 Email

在使用 Laravel 的验证器时,有什么好的输入别名解决方案?

到目前为止,我提出了两个想法:

解决方案 1: 为每个规则使用 Laravel 的自定义错误消息

<?php namespace App\Http\Requests;

use App\Http\Requests\Request;

class AuthLoginRequest extends Request 

    public function rules()
    
        return [
            'username' => 'required|email',
            'password' => 'required'
        ];
    

    // This is redundant. And may have other pitfalls?
    public function messages()
    
        return [
            'username.required' => 'email is required.',
            'username.email' => 'email is invalid.'
        ];
    

    ...

解决方案 2: 使用我自己的自定义表单类来处理将输入名称更改为其标签/别名(username 变为 email 以进行验证目的),运行验证,然后将它们改回来。

【问题讨论】:

我不了解你,但我倾向于以他们接受的数据命名我的字段。如果是用户名,我会这样标记。如果是电子邮件地址,同样的交易。 @MartinBean 这是一个简单的例子。但是当你完成所有工作并且利益相关者说“这个标签对我们的最终用户没有意义”之后,你就有麻烦了。 $ php artisan make:migration rename_username_to_email 我不会说你是这样回应肤浅的要求的。 如果他们有一个有效的点。如果用户通过电子邮件地址进行身份验证,那么我会将该字段命名为 email 而不是 username 【参考方案1】:

使用这个:

$validator = Validator::make($data, [
    'username' => 'required|string', // Your field validation
])
->setAttributeNames(
    ['username' => '"Username"'], // Your field name and alias
);

【讨论】:

【参考方案2】:

`

use App\Http\Requests\Request;

class AuthLoginRequest extends Request 

public function rules()

    return [
        'username' => 'required|email',
        'password' => 'required'
    ];


public function messages()

    return [
        'username.required' => ':attribute is required',
        'username.email' => ':attribute is invalid'
    ];


public function attributes()

    return[
        'username' => 'email', //This will replace any instance of 'username' in validation messages with 'email'
        //'anyinput' => 'Nice Name',
    ];


`

更新

我相信您的消息中任何有:attribute 的地方都将默认为您在表单中设置的名称,或者被上面的attributes() 方法覆盖。 (在:attributehttp://laravel.com/docs/5.0/validation#custom-error-messages)

脚注:我没有解释如何为我的表单创建一个动态数组,因为我正在以一种可能很笨拙的方式迭代每个表单输入。我确实注意到我在表单请求中使用了以下行。我想我会在这里提到以防万一:

use Illuminate\Foundation\Http\FormRequest;

如果这更有帮助,请告诉我!

【讨论】:

你能举一个更完整的例子吗(不一定是大表格,但如果你愿意,可以使用我在我的问题中给出的例子)?您已经注释掉了 2 个部分,而您的示例仍然让我有责任进入 laravel 代码库只是为了理解它。我认为您的解决方案可能是这里正确的解决方案,只需要完成即可。谢谢! @DavidGraham 扩展以包含您的示例,希望这对您有所帮助。对我来说这是一个深夜! 给自己的说明:关于它的文档is here。 :attribute,:max,:min,:size,:values【参考方案3】:

打开文件 resources/lang/en/validation.php,其中 en 是应用程序的默认语言。 thas 如果你使用英语。在文件底部,更新属性数组如下:

'attributes' => array( 'password' => 'Password', 'email' => 'Email Address', ),

添加其他属性名称和相应的错误标签。它会做你想做的事。

【讨论】:

【参考方案4】:

您可以在文件 resources/lang/en/validation.php 中自定义验证输入名称,假设您使用 Laravel 5 并默认使用英语作为语言环境。

您可以找到一个名为“自定义”的数组,只需在其中自定义您的输入名称和验证消息。

例如:

'custom' => array(
    'username' => array(
        'email' => 'Username is actually an email.'
    ),
)

其中“用户名”是您输入的名称,“电子邮件”是内置规则的名称,“用户名实际上是一封电子邮件”是您想告诉用户的任何内容。

希望这会有所帮助!

【讨论】:

+1 当我在全球范围内知道输入将在整个应用程序中使用别名时,这是一个很好的解决方案!但它不适用于我使用与输入名称不同的各种标签的各种形式。 是否可以保持标签与输入名称一致?

以上是关于有没有办法在 Laravel 5 验证规则中为输入名称取别名?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4:动态验证规则

laravel 5.5 修改注册表单验证规则

Laravel 5.8 验证 - 始终遵守任何规则

即使没有上传输入文件,Laravel mimes 验证也总是被调用(不使用必需的规则)

有没有办法使用 Laravel 的验证语法来验证外键?

有没有办法在 Laravel 中为 Nova 资源显式定义策略?