Laravel 5.1 - 自定义验证语言文件

3

是否可以有条件地设置自定义语言文件(例如resources/lang/en/validation_ajax.php)用于验证请求?仅为明确起见,我不想更改应用程序语言,只是根据请求来源使用另一组消息。

当我进行ajax验证调用时,我想使用不同的消息,因为我正在显示字段本身下面的错误消息。 因此,没有必要再次显示字段名称(标签)。

我知道您可以在'attributes' => []上定义标签,但是由于我有许多语言和很多字段,这样做不值得努力。

我正在使用FormRequest(控制器上没有手动调用,只有类型提示)。


你可以在'attributes' => []'messages' => []中使用trans() - user2094178
我不明白这有什么实际意义。Laravel还会自动生成错误数组,所以我需要为每种情况更改它,因此我可以直接在属性上进行操作(这就是整个问题所在,因为我有很多字段)。通过使用另一个文件,我可以轻松删除:attributes并手动处理约5%的边缘情况。 - braindamage
但是如果您在“ServiceProvider”中需要resources/lang/en/validation_ajax.php,那么trans()函数不就可以使用它了吗? - user2094178
使用 trans() 意味着我需要重新处理数组(对于每种类型的请求/响应),而这正是我试图避免的。 - braindamage
1个回答

4
您可以为特定请求(比如登录请求)重写 messages() 方法。让我来演示一下:首先,您需要创建一个新的自定义表单请求,在这里我们将为 email.required 规则定义自定义消息:
<?php namespace App\MyPackage\Requests;

use App\Http\Requests\Request;

class LoginRequest  extends Request {

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    public function messages()
    {
        return [
            'email.required' => 'how about the email?',
        ];
    }


    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'email' => ['required', 'email'],
            'password' => ['required', 'confirmed']
        ];
    }
}

只有email.required规则的消息才会被覆盖。对于密码,它将显示在validation.php文件中设置的默认消息。

现在,在控制器函数中应用表单请求,就像类型提示一样:

class LoginController{

    public function validateCredentials(LoginRequest $request){
        // do tasks here if rules were success
    }
}

就是这样。如果您正在创建自定义包并且需要添加/编辑验证消息,则messages()方法非常有用。

更新

如果您需要将消息的负担带入包的语言文件中,则可以进行以下更改:

  1. At your package create your custom lang file:

    MyPackage/resources/lang/en/validation.php
    
  2. Add the messages keeping the same array's structure as project/resources/lang/en/validation.php file:

    <?php
    return [
        'email' => [
            'required' => 'how about the email?',
            'email' => 'how about the email format?',
        ],
    ];
    
  3. Finally, at your messages() method call the lang's line of your package respectively:

    public function messages(){
        return [
            'email.required' => trans('myPackage::validation.email.required'),
            'email.emial' => trans('myPackage::validation.email.valid'),
        ];
    }
    

我不想手动覆盖这些值,只是想加载另一个文件,其中包含所有ajax请求的定义。我需要手动执行类似于 if ($request->ajax()) { // load another validation.php and return the array } 这样的操作来处理每个单独的Request/message()吗?谢谢! - braindamage
使用您的想象力。 在messages()函数中,我正在返回一个数组。因此,只需返回包含ajax的所有定义的文件的包含即可。 - manix
@manix,如果我们需要在messages方法中添加另一条验证消息怎么办?一个自定义的必填电子邮件消息,另一个自定义的有效电子邮件消息?我知道我们可以添加自定义数组来实现这样的事情在validation.php语言文件中,但我不想让它们成为全局变量。 - Irfan Ahmed
@IrfanAhmed,我完全不理解你的问题,但有两点需要说明:1. 我已经编辑了这个例子,也许可以帮助你如何添加更多的消息。2. 包中的消息不是全局的,因为它们只在加载/调用包时才可用。 - manix
@manix,我已经尝试了你发布的更新,我不认为我们可以针对单个字段即电子邮件.required和电子邮件.email返回多个验证消息。但是我们可以添加不同的元素,如电子邮件.required、密码.required等等。你试过了吗?如果有多个验证失败,比如电子邮件,它只会读取第一个自定义消息。其余的验证消息将从默认语言文件(resources/lang/en/validation.php)中加载。 - Irfan Ahmed
@IrfanAhmed,哦,明白了!让我们看看:(1)我认为我们不能对单个字段返回多个验证消息:是的,可以。您可以使用 $errors->get('email') 获取输入的所有消息,而不是调用 $errors->first('email')。(2)如果有多个验证失败,例如针对电子邮件,它仅会读取第一个自定义消息。是的,但如果要显示来自自定义语言文件的所有消息,则需要覆盖资源语言文件中的所有字符串。如果您想要,请尝试发布新问题,然后在这里标记我,我可以帮忙看一下。 - manix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接