Создание собственного валидатора в Laravel
Доброго времени суток. В статье «Регистрация по инвайтам в Laravel» мы создали регистрацию пользователей в Laravel по инвайтам. Делали проверку введенного кода с кодом хранящимся в базе. В этой статье мы вынесем данную проверку в валидатор. Для чего создадим свое собственное правило валидации в Laravel.
Приступим. И первое, что мы сделаем это создадим свое правило валидации.
Создание собственного правила валидации.
Вообще в Laravel есть несколько способов создания своих правил валидаций. О которых вы можете прочитать в официальной документации.
Создадим файл в папке app/Providers InviteValidator.php и поместим в него следующий код:
<?php namespace App\Providers; use App\Invite; use Illuminate\Validation\Validator; class InviteValidator extends Validator { public function validateInvite ($attribute, $value, $parameters) { $invite = Invite::where('invite',$value)->get(); if($invite->count() == 0){ return false; } return true; } }
Где метод validateInvite описывает наше правило. Если метод вернет true, то валидация прошла успешно, если false, то валидация не пройдет. Метод validateInvite получает три параметра:
- $attribute – имя проверяемого поля
- $value – значение этого поля
- $parameters – параметры, которые мы можем добавить к правилу
Регистрация созданного правила в Laravel
Переходим в файл AppServiceProvider.php, который находится в папке app/Providers и в метод boot добавляем:
Validator::resolver(function($translator, $data, $rules, $messages){ return new InviteValidator($translator, $data, $rules, $messages); });
и не забываем добавить:
use App\Providers\Invite; use Validator;
Применение собственного правила валидации
Откроем файл AuthController.ph. У нас есть метод postRegister (как вы помните мы его изменяли в прошлой статье о регистрации по инвайтам в Laravel), вот его код:
public function postRegister(Request $request) { $invite = Invite::where('invite',$request->invite)->get(); if($invite->count() == 0){ return 'Ooops'; } $validator = $this->validator($request->all()); if ($validator->fails()) { $this->throwValidationException($request, $validator); } $user = $this->create($request->all()); //создаем код и записываем код $code = CodeController::generateCode(8); Code::create([ 'user_id' => $user->id, 'code' => $code, 'type' => 1, ]); //Генерируем ссылку и отправляем письмо на указанный адрес $url = url('/').'/auth/activate?id='.$user->id.'&code='.$code; Mail::send('emails.registration', array('url' => $url),function($message) use ($request) { $message->to($request->email)->subject('Registration'); }); return 'Регистрация прошла успешно, на Ваш email отправлено письмо со ссылкой для активации аккаунта'; }
Отредактируем его следующим образом:
public function postRegister(Request $request) { $validator = $this->validator($request->all()); if ($validator->fails()) { $this->throwValidationException($request, $validator); } $user = $this->create($request->all()); //создаем код и записываем код $code = CodeController::generateCode(8); Code::create([ 'user_id' => $user->id, 'code' => $code, 'type' => 1, ]); //Генерируем ссылку и отправляем письмо на указанный адрес $url = url('/').'/auth/activate?id='.$user->id.'&code='.$code; Mail::send('emails.registration', array('url' => $url), function($message) use ($request) { $message->to($request->email)->subject('Registration'); }); return 'Регистрация прошла успешно, на Ваш email отправлено письмо со ссылкой для активации аккаунта'; }
Теперь перейдем к методу validator и добавим к полю invite наше правило валидации:
protected function validator(array $data) { return Validator::make($data, [ 'email' => 'required|email|max:255|unique:users', 'password' => 'required|confirmed|min:6', 'invite' => 'required|Invite', ]); }
Сообщение валидации
В папке resources/lang/ru создадим файл validation.php (обратите внимание на то, что в папке
resources/lang/en он уже есть – это английская версия сообщений) и добавим в него следующий код:
<?php return [ 'invite' => 'Неверный код :attribute', ];
где в :attribute будет подставлено имя поля.
Проверяем, что получилось. Для начало введем неверный код:
Теперь введем верный код:
Вывод
Мы с вами создали новое правило валидации в Laravel. И применили его при регистрации новых пользователей.