Каждый разработчик рано или поздно сталкивается с задачами, которые нужно выполнять регулярно: чистить кэш, генерировать отчёты, рассылать письма, парсить данные. Делать это вручную — сродни рытью траншеи ложкой. Консольные команды в Yii2 — ваш экскаватор. В этой статье я расскажу, как их готовить, чтобы автоматизация стала простой и приятной.
Что такое консольные команды и зачем они нужны
Консольная команда в Yii2 — это обычный PHP-класс, который наследуется от yii\console\Controller. Он запускается не через браузер, а через терминал. Представьте, что у вас есть робот-пылесос, который сам убирает квартиру, пока вы пьёте кофе. Так и здесь: команда выполняет рутинную работу без вашего участия.
Зачем это нужно? Во-первых, экономия времени. Во-вторых, возможность запускать задачи по расписанию (через cron). В-третьих, удобство отладки — вы видите результат сразу в консоли. И наконец, это просто красиво: одна команда — и сотни записей в базе обновлены.
В Yii2 уже есть встроенные команды, например migrate для миграций или cache/flush для очистки кэша. Но самое интересное — создавать свои.
Создаём первую команду: шаг за шагом
Допустим, мы хотим сделать команду, которая выводит приветствие. Для этого в папке commands (или console/controllers в зависимости от шаблона) создадим файл HelloController.php.
Теперь в терминале из корня проекта выполняем: php yii hello. Увидим «Привет, Гость!». А если напишем php yii hello/index --name=Вася, то получим «Привет, Вася!». Как видите, всё просто: имя действия (action) становится частью команды, а параметры передаются через опции.
Обратите внимание: метод должен возвращать целое число. Ноль — успех, любое другое — ошибка. Это пригодится, когда вы будете запускать команды в скриптах и проверять статус выполнения.
Параметры и опции: как управлять командой
В Yii2 у консольных команд есть два типа входных данных: аргументы (позиционные) и опции (именованные). Аргументы передаются просто как значения после команды, опции — с двумя дефисами. Например: php yii my/action arg1 --option=value.
Чтобы объявить опции, используется метод options(). Вот пример команды, которая приветствует пользователя и может повторять приветствие несколько раз:
'repeat', 'u' => 'uppercase'];
}
public function actionIndex($name = 'Мир')
{
for ($i = 0; $i < $this->repeat; $i++) {
$message = "Привет, $name!";
if ($this->uppercase) {
$message = strtoupper($message);
}
echo $message . "\n";
}
return 0;
}
}
Запустим: php yii greet --name=Петя --repeat=3 --uppercase. Получим три раза «ПРИВЕТ, ПЕТЯ!». Удобно? Ещё бы!
Вот таблица основных методов и свойств для работы с опциями:
| Метод / свойство | Описание |
|---|---|
| options() | Возвращает массив имён опций, которые можно передать команде. |
| optionAliases() | Задаёт короткие псевдонимы для опций (например, 'r' => 'repeat'). |
| public $property | Свойство класса, которое автоматически заполняется значением опции. |
| actionIndex($arg) | Аргументы передаются как параметры метода действия. |
Продвинутые техники: интерактив, вывод и логирование
Консольные команды могут не просто выводить текст, но и общаться с пользователем. Например, запрашивать подтверждение. Для этого есть методы prompt() и confirm(). Скажем, вы делаете команду для удаления всех записей из таблицы. Согласитесь, было бы неплохо спросить: «Вы уверены?».
public function actionClear()
{
if ($this->confirm('Удалить все данные? Это необратимо!')) {
// логика удаления
echo "Данные удалены.\n";
} else {
echo "Отмена.\n";
}
return 0;
}
Для красивого вывода используйте форматирование. Yii2 поддерживает цветной текст через Console::ansiFormat(). Например, ошибки можно выделять красным, успех — зелёным. Это мелочь, но приятно.
Ещё одна полезная штука — логирование. В консольных командах можно писать логи в файл или в базу. Просто используйте Yii::info(), Yii::error() и настройте компонент log в конфиге. По умолчанию логи консольных приложений пишутся в runtime/logs/app.log.
И не забывайте про прогресс-бар. Если команда обрабатывает тысячи записей, покажите пользователю, что процесс идёт. Для этого есть yii\helpers\Console::startProgress().
Планирование задач: cron и Yii2
Консольные команды созданы, чтобы работать без вас. Настройте cron (в Linux) или планировщик задач (в Windows), чтобы они запускались по расписанию. Например, каждый час чистить кэш, каждую ночь делать бэкап базы.
В crontab добавляем строку:
0 * * * * /usr/bin/php /var/www/project/yii cache/flush-all
Это запустит очистку кэша каждый час. Важно указывать полный путь к PHP и к файлу yii, иначе не сработает.
Если у вас несколько окружений (dev, prod), используйте разные конфиги. В Yii2 есть файл yii в корне — это точка входа для консоли. Можно передавать параметр окружения через переменные среды.
Также не забывайте про логирование выполнения задач. Если команда упала с ошибкой, вы должны знать об этом. Настройте отправку уведомлений на email или в Telegram при критических ошибках в консольных командах.
Что в итоге
Консольные команды в Yii2 — это мощный инструмент, который экономит часы рутинной работы. Вы научились создавать простые команды, передавать параметры, использовать интерактив и планировать задачи. Помните: автоматизация — признак хорошего разработчика. Не бойтесь экспериментировать, и ваш проект скажет вам спасибо.
Главное — не забывайте про обработку ошибок и логирование. И тогда даже самые сложные задачи будут выполняться по щелчку пальцев (или по расписанию).
Студия WNDER


