【问题标题】:Laravel 5.1 - Custom validation language fileLaravel 5.1 - 自定义验证语言文件
【发布时间】:2015-11-24 06:10:48
【问题描述】:

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

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

我知道您可以在 'attributes' => [] 上定义标签,但不值得这么努力,因为我有这么多的多种语言字段。

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

【问题讨论】:

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

标签: php validation laravel laravel-5.1


【解决方案1】:

您可以针对特定请求(比如说登录请求)覆盖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() 方法非常有用。

更新

如果您需要将消息包携带到包的 lang 文件中,则可以进行以下更改:

  1. 在你的包中创建你的自定义语言文件:

    MyPackage/resources/lang/en/validation.php
    
  2. 添加与project/resources/lang/en/validation.php文件保持相同数组结构的消息:

    <?php
    return [
        'email' => [
            'required' => 'how about the email?',
            'email' => 'how about the email format?',
        ],
    ];
    
  3. 最后,在你的 messages() 方法中分别调用你包的 lang 行:

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

【讨论】:

  • 我不想手动覆盖这些值,只需加载另一个文件,其中包含所有 ajax 请求的所有定义。我是否需要在每个请求/消息()上手动执行 if ($request-&gt;ajax()) { // load another validation.php and return the array } 之类的操作?谢谢!
  • 发挥你的想象力。在 messages() 函数中,我返回一个数组。因此,只需返回包含所有 ajax 定义的文件。
  • @manix,如果我们需要在消息方法中添加另一个验证消息怎么办。所需电子邮件的一条自定义消息,有效电子邮件的另一条自定义消息?我知道我们可以在validation.php语言文件中添加自定义数组来实现这样的事情,但我不想让那些全局变量。
  • @IrfanAhmed,我完全不明白你的问题,但有两件事:1.我已经编辑了这个例子,它可以帮助你如何添加更多消息。 2.包中的消息不是全局的,因为它们区域仅在您加载/调用包时可用
  • @manix,我已经尝试过您发布的更新,我不认为我们是否可以针对单个字段返回多个验证消息,即 email.required 和 email.email。但是我们可以添加不同的元素,例如 email.required、password.required 等等。你试过吗?如果有多个针对电子邮件的验证失败,比如说,它只会读取第一条自定义消息。其余验证消息将从默认语言文件(resources/lang/en/validation.php)加载
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 2016-01-13
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
相关资源
最近更新 更多