2016-06-20 3 views
5

У меня есть форма, и у меня есть массив полей ввода для видеороликов, теперь, когда я проверяю форму, если у меня есть несколько недопустимых полей с видеороликами, я получаю одно и то же сообщение для каждого из неверное поле, так как я сделал свои собственные сообщения. Я не хочу, чтобы для каждого поля ввода было то же сообщение об ошибке, и я не хочу, чтобы сообщения об ошибках по умолчанию Laravel для массивов, где указано имя поля с сообщением об ошибке, вместо этого я хотел бы иметь сообщения об ошибках со значением, в этом случае url, написанным от пользователя. Как это сделать?Пользовательские сообщения Laravel для проверки массива

Это мой файл запроса с сообщениями и правилами:

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. 

ответ

-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 
} 
2

Чтобы использовать пользовательские сообщения из-за пределов языкового файла проверки, вы можете использовать его таким образом:

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

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

вы можете просто передать массив пользовательских сообщений, как го третий параметр, как я использовал его выше. Надеюсь это поможет.

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 в сообщении об ошибке. Надеюсь это поможет.

+0

, когда я это делаю, как вы предложили, то я получаю сообщение об ошибке: Array для преобразования строки – Marco

+0

Ну правильно, я думаю, теперь я понимаю. Я не думаю, что это возможно - я обновлю свой ответ. – Jonathon

+0

Ты на правильном пути. Проверьте мой комментарий для рабочего решения – smo0f

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; 

} 
0

Я думаю, что это поможет вам, если вы используете «name = location []» это на вашей странице просмотра.

for ($i = 0; $i <= sizeof($location); $i++) { 
$this->validate($request, 
[ 
// set the rules 
    'location.'.$i => 'required', 
    'contact_no.'.$i => 'required', 
    'email.'.$i => 'required|email', 
], 
[ 
// set your custom error messages here 
    'location.'.$i.'.'.'required' => 'Contact no. is required', 
    'contact_no.'.$i.'.'.'required' => 'Contact no. is required', 
    'email.'.$i.'.'.'required' => 'Email is required', 
    'email.'.$i.'.'.'email' => 'Please enter valid email address' 
]); 
} 
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; 
     } 
0

Вы можете с помощью Customizing The Error Format

protected function formatErrors(Validator $validator) 
{ 
    $results = []; 
    $flag = false; 
    $messages = $validator->errors()->messages(); 
    foreach ($messages as $key => $value) { 
     if (!str_contains($key, 'external_media') || !$flag) { 
      $results[] = $value[0]; 
     } 
     if (str_contains($key, 'external_media') && !$flag) { 
      $flag = true; 
     } 
    } 
    return $results; 
} 
Смежные вопросы