Блог Vaden Pro

Все о самостоятельном создании и продвижении сайтов

Создание Artisan команд с новым синтаксисом Laravel 5.1

Раздел: 

Для тех, кто не знаком с Artisan командами, упомяну что это функции командной строки, которые Вы можете запустить для взаимодействия с Вашим приложением Laravel.

Laravel 5.1 Artisan

Если Вы запускаете php artisan из командной строки в любой директории приложения Laravel, Вы увидите список всех команд Artisan доступных для конкретного приложения. Как Вы можете видеть, в стандартную сборку Laravel включено достаточно много функционала:

Laravel дефолтные Artisan команды

Старый синтаксис

Artisan команды предоставляют разработчикам мощный инструмент для работы, который также поддерживает инкапсуляцию данных, но до выхода Laravel 5.1 создание подобной команды приносило немало хлопот. Давайте посмотрим, как это происходило ранее.

В рассмотренных примерах мы будем использовать Symposium команду, которая синхронизирует все конференции доступные в Joind.in API.

Итак, мы создаем новую Artisan команду используя другую Artisan команду:

$ php artisan make:console SyncJoindInEvents

В 5-й версии и ранее для этого использовался следующий шаблон:

<?php namespace Symposium\Console\Commands;
 
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
 
class SyncJoindInEvents extends Command {
 
    /**
     * имя консольной команды
     *
     * @var string
     */
    protected $name = 'command:name';
 
    /**
     * Описание команды в консоли
     *
     * @var string
     */
    protected $description = 'Command description.';
 
    /**
     * Создание новой команды
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }
 
    /**
     * выполнение консольной команды
     *
     * @return mixed
     */
    public function fire()
    {
        //
    }
 
    /**
     * Получение аргументов консольной команды.
     *
     * @return array
     */
    protected function getArguments()
    {
        return [
            ['example', InputArgument::REQUIRED, 'An example argument.'],
        ];
    }
 
    /**
     * Получение опций консольной команды.
     *
     * @return array
     */
    protected function getOptions()
    {
        return [
            ['example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null],
        ];
    }
 
}

Как вы можете видеть, определение аргументов и опций использует сложный синтаксис, который заставляет Вас обращаться к документации на каждом этапе создания команды. В итоге получаем:

<?php namespace Symposium\Console\Commands;
 
use Illuminate\Console\Command;
use Symposium\JoindIn\Client;
 
class SyncJoindInEvents extends Command
{
    protected $name = 'joindin:sync';
 
    protected $description = 'Sync down Joind.in events.';
 
    protected $client;
 
    public function __construct()
    {
        parent::__construct();
 
        $this->client = Client::factory();
    }
 
    public function fire()
    {
        if ($eventId = $this->argument('eventId')) {
            $this->info("Syncing event $eventId");
 
            return $this->client->syncEvent($eventId);
        }
 
        $this->info("Syncing all events");
 
        return $this->client->syncAllEvents();
    }
 
    protected function getArguments()
    {
        return [
            ['eventId', InputArgument::OPTIONAL, '(optional) Joind.In event ID'],
        ];
    }
}

Новый синтаксис

Давайте создадим ту же самую команду, но на этот раз используя синтаксис Laravel 5.1. Получится следующий шаблон:

<?php
 
namespace Symposium\Console\Commands;
 
use Illuminate\Console\Command;
 
class SyncJoindInEvents extends Command
{
    /**
     * имя и подпись консольной команды.
     *
     * @var string
     */
    protected $signature = 'command:name';
 
    /**
     * Описание консольной команды.
     *
     * @var string
     */
    protected $description = 'Command description.';
 
    /**
     * создание новой команды
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }
 
    /**
     * выполнение консольной команды
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}

В первую очередь обратите внимание на отличное PSR-2 форматирование.

Во-вторых, оцените насколько упростился используемый нами шаблон. Но как же мы тогда задаем аргументы и опции?

Подпись

Вы должны были обратить внимание, что $name была заменена на $signature,заметили в описании «имя и подпись консольной команды»? Это особое свойство данной команды в котором мы и задаем наши аргументы и опции, в итоге команда приобретает вид:

<?php
 
namespace App\Console\Commands;
 
use Illuminate\Console\Command;
 
class SyncJoindInEvents extends Command
{
    protected $signature = 'joindin:sync {eventId?}';
 
    protected $description = 'Sync down Joind.in events.';
 
    public function handle()
    {
        if ($eventId = $this->argument('eventId')) {
            $this->info("Syncing event $eventId");
 
            return $this->client->syncEvent($eventId);
        }
 
        $this->info("Syncing all events");
 
        return $this->client->syncAllEvents();
    }
}

Тем, кого заинтересовали прочие возможности команд, рекомендую почитать документацию, вот пара полезностей из нее на которые стоит обратить внимание:

  • Аргументы: joindin:sync {eventId}
  • Опциональные аргументы: joindin:sync {eventId?}
  • Аргументы со значением по умолчанию: joindin:sync {eventId=all}
  • Булевы опции: joindin:sync --wipeOldEvents
  • Опции со значением: joindin:sync --afterDate=
  • Опции со значнием и значением по умолчанию: joindin:sync --afterDate=1999-01-01

Стоит отметить, что Вы также можете добавлять описания в строку:

protected $signature = 'joindin:sync
    {eventId? : (optional) The ID of the event to sync}
    {--wipeOldEvents : Whether to replace all locally-stored events with API results}';

Есть еще много вещей, которые Вы можете сделать, с большинством из которых Вы скорее всего знакомы:

  • $this->argument() или $this->option() чтобы получить данные
  • $this->ask(), $this->secret(), $this->confirm(), $this->anticipate(), и $this->choice() для запросов к пользователям
  • $this->info() и $this->error() чтобы вывести данные

Также появилась пара новых функций для вывода $this->table() и $this->output->progress*, которые будут описаны в следующем уроке.

Подводя итоги

Вот и все. Теперь мы можем просто создавать Artisan команды, без необходимости каждый раз залазить в документацию, чтобы разобраться с их синтаксисом.

Перевод Matt Stauffer "Creating Artisan commands with the new, simpler syntax in Laravel 5.1"

Прочие новинки Laravel 5.1