用于数组验证的Laravel自定义消息

时间:2016-06-20 14:54:04

标签: php laravel

我有一个表单,我有一个视频网址的输入字段数组,现在当我验证表单时,如果我有多个带有视频网址的无效字段,我得到了每个无效字段的相同消息,因为我做了我自己的自定义消息。我不希望每个输入字段都有相同的错误消息,我不希望数组的默认Laravel错误消息,其中字段的名称显示错误消息,而不是,我想有错误消息使用值,在这种情况下从用户写入url。怎么做?

这是我的请求文件,其中包含消息和规则:

public function messages(){

    $messages = [
      'title.required' => 'Du må ha tittel.',
      'type.required' => 'Du må velge artikkeltype.',
      'category.required' => 'Du må velge kategori.',
      'summary.required' => 'Du må ha inngress.',
      'text.required' => 'Du må ha artikkeltekst.',
      'active_url' => 'Du må ha gyldig url.',
    ];
  }

  public function rules(){

    $rules = [
      'external_media.*' => 'active_url',
      'title' => 'required',
      'type' => 'required',
      'category' => 'required',
      'summary' => 'required',
      'text' => 'required',
      //'image' => 'required|image|max:20000',
    ];

    return $rules;

  }

更新了代码以使问题更加清晰

当我有这样的请求文件时:

public function messages(){

    $messages = [
      'title.required'    => 'Du må ha tittel.',
      'type.required'    => 'Du må velge artikkeltype.',
      'category.required'    => 'Du må velge kategori.',
      'summary.required'    => 'Du må ha inngress.',
      'text.required'    => 'Du må ha artikkeltekst.',
      'external_media.active_url' => 'Du må ha gyldig url.',
   ];

   return $messages;
  }

  public function rules(){

    $rules = [
      'external_media.*' => 'active_url',
      'title' => 'required',
      'type' => 'required',
      'category' => 'required',
      'summary' => 'required',
      'text' => 'required',
      //'image' => 'required|image|max:20000',
    ];

    return $rules;

  }

我得到了输出:

The external_media.0 is not a valid URL.
The external_media.1 is not a valid URL.
The external_media.2 is not a valid URL.

而不是那种输出,我想取每个输入的值,并有类似的东西:

The htt:/asdfas.com  is not a valid URL.

10 个答案:

答案 0 :(得分:3)

要使用验证语言文件外部的自定义消息,您可以这样使用它:

$messages = ['username.required' => 'customeError'];

$validator = \Validator::make(
    $data,
    ['username' => 'required'],
    messages
);

您可以将自定义消息数组作为第三个参数传递,就像我上面使用的那样。希望这会有所帮助。

答案 1 :(得分:2)

public function messages() {

    $messages = [
        'title.required'    => 'Du må ha tittel.',
        'type.required'     => 'Du må velge artikkeltype.',
        'category.required' => 'Du må velge kategori.',
        'summary.required'  => 'Du må ha inngress.',
        'text.required'     => 'Du må ha artikkeltekst.',

    ];

    foreach ($this->get('external_media') as $key => $val) {
        $messages["external_media.$key.active_url"] = "$val is not a valid active url";
    }

    return $messages;

}

答案 2 :(得分:2)

public function messages()
        {
            $messages = [];
            foreach ($this->request->get('external_media') as $key => $val) {
                $messages['external_media.' . $key . '.active_url'] = 'The '.$val .' is not a valid URL.'
            }
            return $messages;
        }

答案 3 :(得分:1)

我认为如果您使用" name = location []"这会对您有所帮助。这在您的视图页面中。

const

答案 4 :(得分:1)

对于laravel 7.x,我找到了以下解决方案。您基本上可以使用 def correct(self): global v global p try: if int(self.user_choice.get()) == answer: cor = Label(self.frame,text="Correct!") cor.grid(row=5, pady=20) p += 1 self.sub.destroy() for v in range(v): self.wrongval.destroy() v -= 1 nex = Button(self.frame, text="Next", command=self.necs) nex.grid(row=4) except ValueError: self.wrongval = Label(self.frame, text="Please enter a number") v += 1 print (v) self.wrongval.grid(row=5)

'field.rule' => 'message'

然后在消息中(我将FormRequest用于所有请求):

public function rules() 
{
   return [
      'user.*.firstname' => 'string|required',
   ];
}

您还可以将public function messages() { 'user.*.firstname.required' => 'Firstname of the user is required', } 之类的翻译字符串传递给邮件。

答案 5 :(得分:0)

使用潜在解决方案进行编辑

经过一番挖掘后,我看了Validator类以及如何添加错误消息以查看它是否有任何可用的占位符。

Illuminate\Validation\Validator我认为运行以验证请求的函数是validate,它依次运行每个规则并添加错误消息。与添加错误消息相关的代码是函数结尾处的代码:

    $value = $this->getValue($attribute);

    $validatable = $this->isValidatable($rule, $attribute, $value);

    $method = "validate{$rule}";

    if ($validatable && ! $this->$method($attribute, $value, $parameters, $this)) {
        $this->addFailure($attribute, $rule, $parameters);
    }

正如您所看到的,实际上并没有传递通过添加失败时验证的字段的值,而这又会添加错误消息。

我已经设法做了一些工作来实现你所追求的目标。如果您将这两种方法添加到基本Request类中,通常位于App\Http\Requests\Request

protected function formatErrors(Validator $validator)
{
    $errors = parent::formatErrors($validator);

    foreach ($errors as $attribute => $eachError) {
        foreach ($eachError as $key => $error) {
            if (strpos($error, ':value') !== false) {
                $errors[$attribute][$key] = str_replace(':value', $this->getValueByAttribute($attribute), $error);
            }
        }
    }

    return $errors;
}

protected function getValueByAttribute($attribute)
{
    if (($dotPosition = strpos($attribute, '.')) !== false) {
        $name = substr($attribute, 0, $dotPosition);
        $index = substr($attribute, $dotPosition + 1);

        return $this->get($name)[$index];
    }

    return $this->get($attribute);
}

然后在您的验证消息中,您应该能够放置:value替换器,该替换器应替换为已验证的实际值,如下所示:

public function messages()
{
    return [
        'external_media.*.active_url' => 'The URL :value is not valid'
    ];
}

我注意到您的代码存在一些问题:

  • messages函数中,您提供了active_url的消息,该消息是规则的名称,而不是字段的名称。这应该是external_media
  • 您没有从$messages函数返回messages变量。您需要在最后添加return $messages;

但是,关于您的问题,您编写此代码的类是Illuminate\Http\Request的实例,您应该能够在生成错误消息时访问为该请求提供的实际值。例如,你可以这样做:

public function messages()
{
    return [
        'external_media' => 'The following URL is invalid: ' . $this->get('external_media')
    ];
}

public function rules()
{
    return [
        'external_media' => 'active_url'
    ];
}

其中包括错误消息中提供给external_media的值。希望这会有所帮助。

答案 6 :(得分:0)

您可以使用Customizing The Error Format

diff amount

答案 7 :(得分:0)

这在laravel 5.5中对我来说很好用

$request->validate([
            'files.*' => 'required|mimes:jpeg,png,jpg,gif,pdf,doc|max:10000'
        ],
        [
            'files.*.mimes' => 'Los archivos solo pueden estar con formato: jpeg, png, jpg, gif, pdf, doc.',
        ]
    );

答案 8 :(得分:0)

'external_media.*.required' => 'active_url',

答案 9 :(得分:-1)

您可以使用

$messages = [
    'title.required' => 'Du må ha tittel.',
    'type.required' => 'Du må velge artikkeltype.',
    'category.required' => 'Du må velge kategori.',
    'summary.required' => 'Du må ha inngress.',
    'text.required' => 'Du må ha artikkeltekst.',
    'active_url' => 'Du må ha gyldig url.',
];

$validator = Validator::make($data, [
    'external_media.*' => 'active_url',
    'title' => 'required',
    'type' => 'required',
    'category' => 'required',
    'summary' => 'required',
    'text' => 'required',
    //'image' => 'required|image|max:20000'
], $messages);

if ($validator->fails()){
    // handle validation error
} else {
    // no validation error found
}