7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. PHP

Ваш путеводитель по командам в Laravel

Scroll to top
Read Time: 14 mins

Russian (Pусский) translation by Sergey Zhuk (you can also view the original English article)

В настоящее время вполне нормально для разработчика иметь понимание работы с консолью и знать как использовать основные команды. Но иногда нам может понадобится написать свои собственные команды для улучшения своего рабочего процесса. Если мы взглянем назад на Laravel 3, то можно вспомнить что он предлагает использование задач. Задачи были чрезвычайно полезны, но до сих пор они слабо подходили для более сложных операций. К счастью Laravel 4 поставляется с пакетом Artisan, который сильно облегчит вашу жизнь как разработчика!


Что такое Artisan?

Artisan это утилита командной строки, которая была представлена в Laravel 3.

Если вы не знакомы с Laravel, то вы могли и не знать о ней. Artisan - это утилита командной строки, которая была представлена в Laravel 3. Если вы использовали другие фреймворки, то можно сравнить Artisan с Oil в FuelPHP, ZFTool в Zend, или Console в Symfony 2.

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


Основы Artisan

Вот где Artisan показывает всю свою мощь.

В Laravel 3 Artisan был написан с нуля Тейлором Отвеллом (создателем Laravel), и был еще достаточно простым. Теперь после того как Laravel 4 стал базироваться на пакетах Composer, то он может использовать существующие пакеты, разработанные другими разработчиками. В результате чего Laravel 4 теперь зависит от множества пакетов из фреймворка Symfony. Один из них - это замечательный Console Component.

Если мы откроем исходный код приложения Artisan в Illuminate\Console\Application, то увидим что сам класс наследуется от Symfony\Component\Console\Application. Вот где Artisan предстает во всей своей красе. Хотя Artisan и использует компонент Symfony's Console, но многие методы получили более похожие на Laravel псевдонимы. Так что не беспокойтесь, по прежнему есть ощущение что вы работаете с Laravel!


Общие вопросы

Обычно всплывают два вопроса, при попытке создать новую команду.

Где мне следует располагать команды?

Когда вы устанавливаете новое приложение Laravel, то обнаружите предустановленную директорию app/commands. Она также находится по умолчанию в classmap вашего файла composer.json. Это означает, что как только вы создали команду, то необходимо выполнить composer dump-autoload для генерации обновленного автозагрузчика. Если вы этого не сделаете, то получите ошибки, указывающие на то, что ваша команда не найдена.

Если вы разрабатываете пакет, то необходимо создать директорию src/<vendor>/<package> в вашем пакете для хранения команд. Во всей кодовой базе Laravel 4 этот каталог называется Console. Убедитесь, что директория автоматически подгружается в вашем composer.json фале. 

Как мне следует именовать команды?

В кодовой базе Laravel 4 все команды имеют суффикс Command и названы по имени задачи, которую они выполняют. Допустим, что у нас есть команда, которая очищает кэш. Можно назвать ее CacheClearCommand.


Основы команд

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

Laravel может создать прототип команды для вас! Просто выполняем:

Эта команда создаст каркас для вас, однако для целей этой статьи мы пройдем весь процесс создания команды с самого начала, так чтобы ознакомиться с каждой частью этого процесса.

Имя команды

Любая команда должна иметь имя. Это имя используется для запуска команды из консоли, и должно описывать задачу, которую команда выполняет. Пока нет никакого соглашения о том, как команды должны именоваться, то можно рассмотреть следующий вариант:namespace:group/command, namespace:command, или просто command.

Описание команды

Любая команда должна иметь описание. Описание используется при получении списка доступных команд из Artisan, и при просмотре помощи для команды. Описания должны кратко описывать задачу, которую выполняет команда.

Если мы попробуем открыть консоль и получить список всех доступных команд, то мы по-прежнему не увидим нашу команду в списке.

Чтобы ее зарегистрировать, откроем файл app/start/artisan.php и быстро просмотрим блок комментариев в нем. Когда мы запускаем Artisan из консоли, то подключается этот файл; мы будем использовать его для загрузки наших команд. В этом файле мы имеем доступ к переменной $artisan, которая была объявлена до включаемого файла. Помните класс приложения Artisan, который мы рассматривали ранее? Тот самый, который расширяет компонент Symfony Console? Итак, переменная $artisan - это объект этого класса.

Добавим нашу команду, чтобы она стала доступна из консоли.

Или так, если вы предпочитаете статический синтаксис:

Метод add принимает объект команды. Как только наша команда была добавлена, то мы можем получить к ней доступ из консоли.

Команда так же будет перечислена в списке доступных команд.

Если вы получили какие-либо ошибки, то выполните composer dump-autoload в корневой директории приложения, после создания команд.


Цветной вывод

Вывод цветного текста в консоль легко реализуется в Artisan. Существуют четыре метода для цветового ANSI вывода.


Опции и Аргументы

Новая особенность Artisan - это возможность предоставлять команды с опциями и аргументами.

Аргументы

Аргументы - это строки, которые вы передаете в команду. Важно их передавать в том же порядке, в каком они были определены. Рассмотрим следующую команду:

Аргумент name должен быть передан перед аргументом email.

Аргументы можно определить как необязательные.

Опции

Опции всегда является необязательными, и при передаче из команде перед ними располагают два дефиса.

Помимо использования в качестве логических значений, можно настроить опцию, чтобы она принимала значение или массив значений.

Определение опций и аргументов

Перед тем как вы определение опции и аргументы, лучше всегда импортировать необходимые классы Symfony. Вот два класса, которые нам понадобятся: Symfony\Component\Console\Input\InputOption и Symfony\Component\Console\Input\InputArgument.

После определения классов, мы их импортируем.

Чтобы определить опции и аргументы, необходимо создать два новых метода: getArguments и getOptions. Оба этих метода возвращает массив аргументов или опций. Пусть наша команда принимает аргумент name и опцию age.

Помните, что Laravel может сгенерировать весь этот код за вас. Мы делаем это все вручную только лишь для целей изучения каждой строчки класса команды.

Теперь мы можем передавать аргумент name и опцию age из консоли.

Оба аргумент и опция определяются как многомерный массив. Взглянем более детально на каждое из этих определений.

Определения аргументов

Определение массива в качестве аргумента принимает четыре ключа, и только первый из них является обязательным. Второй ключ является режимом работы аргумента и может быть InputArgument::OPTIONAL или InputArgument::REQUIRED. Третий - это описание, а четвертый - значение по умолчанию, если режим аргумента InputArgument::OPTIONAL.

Вот аргумент, который использует все ключи массива.

Определения опций

Определение опции в виде массива принимает пять ключей, первый из которых (имя опции) является обязательным. Второй ключ - это сокращение для опции (например -a). Третий - это режим работы опции и может принимать любое из этих значений: InputOption::VALUE_NONEInputOption::VALUE_REQUIREDInputOption::VALUE_OPTIONAL, или InputOption::VALUE_IS_ARRAY. Четвертый ключ - это описание опции, а пятый - значение по умолчанию, если режим опции не выставлен в InputOption::VALUE_NONE или InputOption::VALUE_REQUIRED.

Вот определение опции, которая использует все ключи массива.

Можно так же комбинировать режим InputOption::VALUE_IS_ARRAY c InputOption::VALUE_REQUIRED или InputOption::VALUE_OPTIONAL.


Подтверждения и вопросы

Другой интересной функцией Artisan является возможность запрашивать информацию, или задавать пользователю вопросы. Что делает разработку интерактивных команд весьма простым занятием.

Подтверждения

Используя confirm, мы можем задать пользователю вопрос, и дать на выбор варианты ответа "yes" или "no". Давайте спросим у пользователя подтверждение, что он верно ввел свой возраст.

Первый параметр - это вопрос, который будет отправлен пользователю, а второй - ответ по умолчанию, на случай если пользователь нажмет enter сразу без ввода ответа.

Вопросы

Используя ask, мы можем спрашивать у пользователя вопросы и получать ответы на них. Вместо завершения программы в случае некорректного возраста, давайте спросим у пользователя его еще раз.


Зависимости команд

Инъекция зависимости - это важный шаг для создания трестируемого кода. Давайте расширим нашу команду, добавив в нее инъекцию объекта модели, таким образом чтобы можно было сгенерировать пользователя. Начнем с создания интерфейса и модели пользователя.

Наш UserInterface в действительности не определяет никакого метода, так как это просто пример. Для реального же приложения, вы определите методы, которые будут нужны в модели.

Теперь после того как мы имеем модель User, которая реализует интерфейс UserInterface, мы можем продолжить настройку нашей инъекции зависимости в команду. Я собираюсь еще кое что добавить в нашу команду, чтобы можно было взаимодействовать с нашей моделью User.

Первое, что вы могли заметить, это то что команда теперь имеет конструктор. Этот конструктор принимает один параметр, которому мы указали тип UserInterface, так что мы теперь знаем, что класс, который мы получим, реализует методы из этого интерфейса. Конструктор команды должен вызвать родительский конструктор.

В методе команды fire мы напрямую задаем свойства объекта модели User. Мы также используем цикл для того чтобы задать пользователю вопрос о корректности введенного адреса. И наконец пользователь сохраняется в базе данных, и мы выводим на консоль сообщение о том, что пользователь был создан и сохранен.

Но погодите! Перед тем, как начать использовать нашу команду, нам нужно создать объект модели User.

Если у вас настроена база данных, вы уже сможете запустить команду и новый пользователь будет сохранен!


Команды пакетов

Если вы разрабатываете пакет или библиотеку для Laravel, то возможно вы захотите включить туда команду. Регистрация команд из пакетов очень проста, за исключением того, что вы не можете добавить команду в файл app/start/artisan.php. Вместо этого, вы получаете их с помощью Artisan внутри вашего поставщика услуг (service provider).

Метод commands может принимать любое количество аргументов, и сможет получить объект команды из контейнера приложения, в котором запущен Artisan.


Заключение

Когда сравниваешь Artisan в Laravel 4 и в Laravel 3, то понимаешь что улучшения в нем просто монументальные. Команды теперь могут быть привязаны к IoC контейнеру и включать в себя инъекцию зависимостей, предоставлять вывод ANSI, использовать аргументы и опции, и запрашивать взаимодействие с пользователем.

Благодаря компоненту Symfony Console мощь Artisan просто невероятна. Команды теперь начинают играть значимую роль в разработке.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.