пятница, 21 июля 2017 г.

LARAVEL. СООБЩЕНИЯ ОШИБОК ВАЛИДАЦИИ

Сообщение об ошибках формируется в текущей локализации Laravel.
\config\app.php Текущая локлизация: 'locale' => 'en',

Адрес локализации: \resources\lang\en\validation.php

Например, для обязательного поля это: 'required'             => 'The :attribute field is required.',
:attribute — это переменная, которая потом будет заменена на имя поля.

Можно добавлять пользовательские сообщения, не меняя стандартные.
В этой ячейки можно описать свои правила:
'custom' => [
 'attribute-name' => [
 'rule-name' => 'custom-message',
 ],
 ],


Напишем свои правила:
'custom' => [
 'name' => [
 'required' => 'Поле name обязательно к заполнению',
 ],
 ],

Идем в файл: \app\Http\Requests\ContactRequest.php
public function rules()
 {
 return [
 'name' => 'required',
 'email' => 'max:5|required' // не более 5 символов
 ];
 }

Файл \resources\lang\en\validation.php
 'custom' => [
 'name' => [
 'required' => 'Поле name обязательно к заполнению',
 ],
 'email' => [
 'max' => 'Максимально допустимое количество символов - :max',
 'required' => 'E-mail обязателен'
 ]
 ],

Опишем пользовательские сообщения для правила required.
Если мы используем пользовательские сообщения, то сообщения локализации не используются фреймворком.
Идем в файл: \app\Http\Requests\ContactRequest.php

public function messages()
 {
 return [
 'required' => 'Данное поле :attribute обязательно к заполнению',
 ];
 }

Если данное сообщение необходимо только для поля name:
 public function messages()
    {
        return [
            'name.required' => 'Данное поле :attribute обязательно к заполнению',
        ];
    }


или так:

 public function messages()
 {
 return [
 'name.required' => 'Данное поле :attribute обязательно к заполнению',
 'email.max' => 'Максимально допустимое количество символов - :max',
 ];
 }

Изменим контроллер  в \app\Http\Controllers\Admin\ContactController.php

 public function store(Request $request, $id=FALSE) {
 // Если запрос - метод post, то валидируем данные:
 if($request->isMethod('post')) {
 
 $messages = [
 'name.required' => 'Данное поле :attribute обязательно к заполнению',
 'email.max' => 'Максимально допустимое количество символов - :max',
 ];
 
 $validator = Validator::make($request->all(), [ 'name' => 'required'
 ], $messages);
 
 // Если валидация была завершена с ошибками
 if($validator->fails()) {
 return redirect()->route('contact')->withErrors($validator)->withInput(); // ошибки будут сохранены в сессию
 } 
 }
 
 return view('default.contact', ['title'=>'Contacts']);
 }
Если не заполнить поле name, то выведется ошибка.

Распечатаем объект ошибок:
public function store(Request $request, $id=FALSE) {
 // Если запрос - метод post, то валидируем данные:
 if($request->isMethod('post')) {
 
 $messages = [
 'name.required' => 'Данное поле :attribute обязательно к заполнению',
 'email.max' => 'Максимально допустимое количество символов - :max',
 ];
 
 $validator = Validator::make($request->all(), [
 'name' => 'required'
 ], $messages);
 
 // Если валидация была завершена с ошибками
 if($validator->fails()) {
  $messages = $validator->errors();
 dump($messages);
 // return redirect()->route('contact')->withErrors($validator)->withInput(); // ошибки будут сохранены в сессию
 } 
 }
 
 return view('default.contact', ['title'=>'Contacts']);
 }

Выводит:
MessageBag {#200 ▼
  #messages: array:1 [▼
    "name" => array:1 [▼
      0 => "Данное поле name обязательно к заполнению"
    ]
  ]
  #format: ":message"
}

Если мы напишем:
 $messages = $validator->errors();
 dump($messages->all());

То у нас выведется массив ошибок:
array:1 [▼
  0 => "Данное поле name обязательно к заполнению"
]

Или
dump($messages->first('name'));
Выводит:  Данное поле name обязательно к заполнению

Если нам нужны все сообщения об ошибках, то используем метод get().
dump($messages->get('name')); // в кавычках используем имя интересующего поля

Метод has() проверяет есть ли для конкретного поля сообщения об ошибках.
 if($validator->fails()) {
 $messages = $validator->errors();
 
 // если для поля name есть сообщения об ошибках, то отобразим их на экране
 if ($messages->has('name')) {
 dump($messages->get('name'));
 } 
 } 

Можно обернуть сообщения в теге так:
 if($validator->fails()) {
 $messages = $validator->errors();
 
 // если для поля name есть сообщения об ошибках, то отобразим их на экране
 if ($messages->has('name')) {
 dump($messages->all('<p> :message </p>')); // метка :message будет заменена сообщением об ошибке
 } 
 
 } 
Выводит: array:2 [▼
  0 => "<p> Данное поле name обязательно к заполнению </p>"
  1 => "<p> E-mail обязателен </p>"
]

Или для одного поля: dump($messages->first('name', '<p> :message </p>'));

Иногда нужно выполнить какое-то действие сразу после создания валидатора.
Метод after() позволяет описать функцию, которая выполнится сразу после создания валидатора.

if($request->isMethod('post')) {
        
            $messages = [
                'name.required' => 'Данное поле :attribute обязательно к заполнению',
                'email.max' => 'Максимально допустимое количество символов - :max',
            ];
            
            $validator = Validator::make($request->all(), [
                'name' => 'required',
                'email' => 'required'
            ], $messages);
            
            $validator->after(function($validator) {
                $validator->errors()->add('name', 'Дополнительное сообщение');
            });
                
            // Если валидация была завершена с ошибками
            if($validator->fails()) {
                $messages = $validator->errors();  
                
                return redirect()->route('contact')->withErrors($validator)->withInput(); // ошибки будут сохранены в сессию
            } 
        }
Выводятся ошибки:
 Данное поле name обязательно к заполнению
 Дополнительное сообщение
 E-mail обязателен

Правило sometimes
$validator = Validator::make($request->all(), [
 'name' => 'required',
 'email' => 'sometimes|required' // поле обязательно к заполнению, если оно присутствует в объекте request
 ], 

Метод  sometimes описывает правила, которые будут применены к полям, если функция-обработчик вернет истину. 

public function store(Request $request, $id=FALSE) {
        // Если запрос - метод post, то валидируем данные:
        if($request->isMethod('post')) {
        
            $messages = [
                'name.required' => 'Данное поле :attribute обязательно к заполнению',
                'email.max' => 'Максимально допустимое количество символов - :max',
            ];
            
            $validator = Validator::make($request->all(), [
                'name' => 'required',
                //'email' => 'required' // поле обязательно к заполнению, если оно присутствует
            ], $messages);
            
            // $input - объект входных данных
            // Если длина имени >= 10, то поле email обязательно к заполнению
            $validator->sometimes('email', 'required', function($input) {
                return strlen($input->name) >= 10;
            });
            
                           
            // Если валидация была завершена с ошибками
            if($validator->fails()) {
                $messages = $validator->errors();                 
                return redirect()->route('contact')->withErrors($validator)->withInput(); // ошибки будут сохранены в сессию
            } 
        }
        
        return view('default.contact', ['title'=>'Contacts']);
    }
Метод failed()
public function store(Request $request, $id=FALSE) {
 // Если запрос - метод post, то валидируем данные:
 if($request->isMethod('post')) {
 
 $messages = [
 'name.required' => 'Данное поле :attribute обязательно к заполнению',
 'email.max' => 'Максимально допустимое количество символов - :max',
 ];
 
 $validator = Validator::make($request->all(), [
 'name' => 'required',
 //'email' => 'required' // поле обязательно к заполнению, если оно присутствует
 ], $messages);
 
 // $input - объект входных данных
 // Если длина имени >= 10, то поле email обязательно к заполнению
 $validator->sometimes('email', 'required', function($input) {
 return strlen($input->name) >= 10;
 });
 
 // $validator->after(function($validator) {
 // $validator->errors()->add('name', 'Дополнительное сообщение');
 // });
 
 // Если валидация была завершена с ошибками
 if($validator->fails()) {
 $messages = $validator->errors(); 
 dump($validator->failed()); // массив с ошибками валидации данных
 exit();
 return redirect()->route('contact')->withErrors($validator)->withInput(); // ошибки будут сохранены в сессию
 } 
 }  

Выводит массив:


   array:1 [▼
  "name" => array:1 [▼
    "Required" => []
  ]
]



Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html