Создание artisan команды в Laravel

Ромчик
0

laravelДоброго времени суток. В данной статье мы рассмотрим как создать artisan команду в Laravel, как оформить вводв/вывод данных команды artisan. И рассмотрим пример используя предыдущие статьи: «Регистрация, активация и авторизация в Laravel (часть 1)» и «Регистрация, активация и авторизация в Laravel (часть 2)». В данных статьях мы рассмотрели регистрацию, активацию и авторизацию пользователей в Laravel. Создали две таблицы users и codes. Первая команда artisan будет удалять всех просроченных пользователей и выводить данные об удаленных в виде таблицы, а вторая команда будет удалять просроченные коды и на экране будет отображаться прогресс бар выполнения команды.

У нас есть две таблицы users и codes. В этих таблицах есть поле created_at по которому мы и будем отслеживать просроченных пользователей и просроченные коды. Время действия не активированного пользователя и время действия кода мы будем задавать в конфигурационном файле main.php

Создание конфигурационного файла в Laravel

Переходим в папку config и создадим в ней файл main.php. Файл конфигурации в Laravel представляет собой массив данных. Давайте добавим в наш файл время действия (время будем писать в часах) для пользователя и время действия для кода:

<?php
return [
	'expire_user' => '1',
	'expire_code' => '1',
];

Для получения данных из конфигурации используется следующая команда:

    config(<название файла конфигурации>.<ключ>);

В нашем случае для получения периода действия для пользователя:

	config('main.expire_user');

Теперь мы готовы перейти к созданию artisan команды.

Создание artisan команды в Laravel

Создается artisan команда с помощью команды:

    php artisan make:console DelExpUser

где DelExpUser – это название файла в котором мы опишем действие команды.

Давайте рассмотрим созданный файл. Перейдем в папку app/Console/Commands и откроем наш файл DelExpUser:

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class DelExpUser extends Command
{
    /**
     * The name andsignature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}

Свойство $signature – это название команды в artisan, давайте зададим delExp:user.

Свойство $description – это описание команды, зададим «Удаление просроченных пользователей».

И два метода __construct и handle думаю их описывать не надо. Тем более с методом handle мы уже сталкивались в одной статье «Создание событий (Event) в Laravel 5». Давайте изменим наш файл следующим образом:

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class DelExpUser extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'delExp:user';
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Удаление просроченных пользователей';

    /**
     * Create a new command instance.
     *
     * @return void
     */

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        dd('Test');
    }
}

И зарегистрируем нашу команду. Для этого откроем файл app/Console/Kernel.php и в свойство $commands добавим следующее:

\App\Console\Commands\DelExpUser::class,

Вот, как выглядит файл Kernel.php

<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \App\Console\Commands\Inspire::class,
        \App\Console\Commands\DelExpUser::class,
    ];
    /**
     * Define the application's command schedule.
     *
     * @param \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('inspire')->hourly();
    }
}

Отлично, у нас есть команда delExp:user. Давайте проверим. Запустите команду

    artisan list

 01

Отлично, но пока команда наша ничего полезного не делает, просто выводит «Test», проверим. Запустим команду:

    artisan delExp:user

02

Все отработало. Теперь напишем логику нашей команды – удаляем всех неактивных пользователей у которых поле created_at + время действия меньше текущей даты. Приступим.

Изменим метод handle в файле нашей команды:

public function handle()
    {
        $user = User::where('activated',0)->get();
        $time = config('main.expire_user');
        //переводим часы в секунды
        $time = $time*3600;
        foreach ($user as $u) {
            $date = strtotime($u->created_at)+$time; 
            if($date < time()){              
                User::find($u->id)->delete();
                $table[] = [$u->id,$u->email];
            }
        };      
        $this->info('Удаленные пользователи:');
        $headers = ['ID','Email'];      
        $this->table($headers, $table);
    }

Давайте проверим зарегистрируем двух пользователей и у одного отредактируем время в поле created_at, так чтобы он был явно просроченным. Пользователей не активируем!!!

03

Пользователь test1@mail.ru просроченный. Теперь запустим нашу команду:

    artisan delExp:user

04

Отлично, нам вывелось сообщение «Удаленные пользователи» и таблица с email удаленных пользователей.

Давайте проверим таблицу users в базе данных.

 05

Просроченный пользователь test1@mail удален.

Давайте создадим вторую команду delExp:code, которая будет удалять просроченные коды. Действуем аналогично.

Генерируем с помощью artisan файл для команды:

php artisan make:console DelExpCode

Регистрируем команду в Kernel.php в свойстве $commands:

protected $commands = [       
    \App\Console\Commands\Inspire::class,      
    \App\Console\Commands\DelExpUser::class,       
    \App\Console\Commands\DelExpCode::class,
];

Вот как выглядит наш DelExpCode.php

<?php
namespace App\Console\Commands;
use App\Code;
use Illuminate\Console\Command;
class DelExpCode extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'delExp:code';

    /**
     * The console command description.
     *
     * @var string
     */

    protected $description = 'Удаление просроченных кодов';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {      
         parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */

    public function handle()
    {
        $code = Code::all();
        $time = config('main.expire_code');
        //переводим часы в секунды
        $time = $time*3600;
        $bar = $this->output->createProgressBar(count($code));
        foreach ($code as $c) {
            $date = strtotime($c->created_at)+$time; 
            if($date < time()){              
                Code::find($c->id)->delete();
            };
            sleep(1);          
            $bar->advance();
        };
        $bar->finish();
    }
}

Проверяем. Добавим с десяток просроченных кодов.

06

У нас все коды просрочены, кроме одного с ID=2. Запускаем нашу команду:

	artisan delExp:code

07

Наш прогресс бар работает. И завершение выполнения команды:

08

Команда отработала. Проверим таблицу codes:

09

Все отработало.

Вывод

В данной статье мы рассмотрели как создать команду artisan в Laravel. И в качестве практики создали две команды. Первая команда выводит нам табличный результат, а вторая процесс выполнения в виде прогресс бара. Так же мы создали файл конфигурации из которого при помощи стандартной функции получили данные. Как видите создание команд artisan в Laravel не сложный процесс, как впрочем и сама разработка на Laravel. Более подробно по созданиям команд вы можете прочитать в официальной документации.

А на этом все. Успехов в разработке.

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

©2012-2018 По всем вопросам обращайтесь через форму обратной связи

Яндекс.Метрика