我有一个表单,我有一个视频网址的输入字段数组,现在当我验证表单时,如果我有多个带有视频网址的无效字段,我得到了每个无效字段的相同消息,因为我做了我自己的自定义消息。我不希望每个输入字段都有相同的错误消息,我不希望数组的默认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.
答案 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
}