Добавление валидации в artisan команду Laravel
Доброго времени суток. В одной своей статье «Создание artisan команды в Laravel» я рассмотрел как создать консольную команду в Laravel. Все хорошо. Но! Возникают ситуации, когда необходимо в консольной команде использовать валидацию Laravel. Например, при записи данных в базу проверять значение поля на уникальность или значение является email адресом. Дальше давайте это реализуем.
Как устанавливать и настраивать Laravel я не буду (в интернете материалов много). Если вы еще не знаете как установить и произвести первоначальную настройку Laravel, то обратитесь к документации.
Шаг 1. Создание таблицы и модели.
На этом шаге мы создадим миграцию для создания таблицы emails, в которой мы будем хранить email адреса. В этой таблице будет три поля: email, created_at, updated_at. Дальше создадим модель Email для работы с нашей таблицей users.
Для создания миграции create_emails_table выполним следующую команду:
php artisan make:migration create_emails_table --create=emails
Отлично миграция создана.
При создании миграции мы использовали параметр create, который сразу в миграцию подставит код для создания таблицы с названием указанным в значении этого параметра.
Теперь отредактируем нашу миграцию (изменим метод up):
Было:
public function up() { Schema::create('emails', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); }); }
Стало:
public function up() { Schema::create('emails', function (Blueprint $table) { $table->increments('id'); $table->text('email'); $table->timestamps(); }); }
Отлично. Теперь мы можем запустить миграцию, для этого выполним следующую команду:
php artisan migrate
Отлично миграция выполнена. И если мы перейдем в нашу базу данных, то увидим таблицу emails с полями: id, email, created_at, updated_at
Теперь давайте создадим модель Email для этого выполните команду:
php artisan make:model Email
Модель создана.
Поправим немного только, что созданную модель (добавим свойство $fillable, в котором указываются разрешенные для массового добавления поля ).
Все модели по умолчанию находятся в каталоге app
protected $fillable = ['email'];
Отлично. Мы создали таблицу и модель. Теперь можем перейти ко второму шагу.
Шаг 2. Создания консольной команды Laravel
Для создания artisan команды необходимо выполнить команду:
php artisan make:command CreateEmail
Отлично. Команда создана.
Более подробно, как создать и как зарегистрировать команду вы можете прочитать в статье «Создание artisan команды в Laravel»
Команду я назвал: email:create
Описание команды: write email to the database
Теперь для вывода списка всех artisan команд введем команду:
php artisan
Отлично команда создана. Переходим к следующему шагу.
Шаг 3. Описание команды и добавление валидации к artisan команде.
Основной функционал консольной команды Laravel описывается в методе handle.
Давайте сначала опишем функционал команды без валидации. При вызове команды мы должны ввести email. Дальше этот email должен быть записан в базу. Если email записан в базу, то должно быть сообщение «User created».
public function handle() { //запрашиваем email адрес $email = $this->ask('Email'); //записываем email в базу \App\Email::create([ 'email' => $email, ]); //выводим сообщение User created $this->info('User created!'); }
Проверяем. Выполняем команду:
php artisan email:create
Отлично. Если проверим базу данных, то в таблице emails у нас появилась запись.
Теперь давайте добавим валидацию.
Первое нужно указать, что мы используем Validator
use Validator;
Проверять email мы будет, что поле обязательное, уникальное и это email адрес.
Поправим наш метод handle:
public function handle() { //запрашиваем email адрес $email = $this->ask('Email'); //валидация $validator = Validator::make(['email'=>$email],['email' => 'required|email|unique:emails']); if ($validator->fails()) { //выводим ошибку $this->error('User not created'); //выводим ошибки валидации foreach ($validator->errors()->all() as $error){ $this->comment($error); } die; } //записываем email в базу \App\Email::create([ 'email' => $email, ]); //выводим сообщение User created $this->info('User created!'); }
Проверяем. Сначала давайте введем email, который уже есть. Дальше введем email, который не является email адресом. А затем введем email, который является email адресом и которого нет в базе данных.
Как видим валидация работает.
Заключение.
Мы с вами создали artisan команду, которая записывает в базу данные, но перед этим валидирует их. И если валидация не проходит, то в консоль выводятся сообщения валидации.