Вы когда-нибудь тратили часы на однотипные действия: чистка кэша, отправка писем, импорт данных из CSV? В Yii2 есть мощный инструмент — консольные команды. Они позволяют запускать сценарии прямо из терминала, экономя кучу времени. В этой статье я покажу, как их создавать, настраивать и использовать. Без лишней теории, только практика.
Что такое консольные команды в Yii2 и зачем они нужны
Консольные команды в Yii2 — это PHP-классы, которые выполняются в командной строке (терминале, консоли). Они наследуются от yii\console\Controller и работают точно так же, как обычные контроллеры, только без веб-интерфейса. Это идеальный инструмент для задач, которые не требуют браузера: запуск крона, обработка очередей, генерация отчетов.
Представьте, что вы каждый день вручную обновляете курсы валют. С консольной командой это можно автоматизировать одной строкой в crontab. Или вы хотите проверить, все ли пользователи подтвердили email. Одна команда — и готово. Это как робот-помощник, который не спит и не просит кофе.
Структура консольного контроллера в Yii2
Консольные команды живут в директории commands/ вашего приложения. Каждый класс — это отдельный контроллер, а его публичные методы — это действия (actions). Имя класса должно заканчиваться на Controller, а файл — на Controller.php. Например, CronController.php.
Вот минимальный пример:
<?php
namespace app\commands;
use yii\console\Controller;
class CronController extends Controller
{
public function actionIndex()
{
echo "Привет из консоли!\n";
}
public function actionSendEmails()
{
echo "Отправляю письма...\n";
// Тут логика отправки
echo "Готово!\n";
}
}Запустить эту команду можно так: ./yii cron или ./yii cron/send-emails. Обратите внимание: Yii2 сам преобразует дефисы в camelCase. То есть actionSendEmails превращается в send-emails.
Параметры команд: как передавать данные
Часто нужно передать команде какие-то данные: ID пользователя, дату, путь к файлу. В Yii2 это делается через аргументы и опции. Аргументы — это обязательные параметры, которые передаются в порядке очереди. Опции — необязательные, с именем.
Пример с аргументами:
public function actionProcessUser($userId, $limit = 10)
{
echo "Обрабатываю пользователя $userId с лимитом $limit\n";
}Запуск: ./yii cron/process-user 42 или ./yii cron/process-user 42 --limit=20.
Опции задаются через рефлексию: если у метода есть параметр с типом string или int, Yii2 автоматически считает его опцией. Можно также использовать атрибуты, но это уже для продвинутых.
| Тип параметра | Способ передачи | Пример |
|---|---|---|
| Аргумент | Позиционный | ./yii command action 123 |
| Опция | --имя=значение | ./yii command action --name=John |
Взаимодействие с пользователем: ввод и вывод
Консольные команды могут не только выводить текст, но и запрашивать ввод. Это полезно для интерактивных скриптов. Yii2 предоставляет методы stdout(), stderr(), prompt(), select() и другие.
Пример запроса подтверждения:
$answer = $this->prompt('Вы уверены? (yes/no): ', [
'required' => true,
'validator' => function($input) {
return in_array($input, ['yes', 'no']);
},
]);
if ($answer === 'yes') {
$this->stdout("Отлично, продолжаем!\n");
} else {
$this->stderr("Отмена.\n");
}Также можно выводить прогресс-бар для длительных операций:
$items = range(1, 100);
$progress = $this->startProgress(100, 'Обработка...');
foreach ($items as $item) {
usleep(50000); // Имитация работы
$progress->update($item);
}
$this->endProgress();Автоматизация с помощью консольных команд: пример с импортом CSV
Давайте напишем реальную команду для импорта пользователей из CSV-файла. Это классическая задача, которая часто встречается в проектах.
<?php
namespace app\commands;
use yii\console\Controller;
use app\models\User;
class ImportController extends Controller
{
public function actionCsv($file)
{
if (!file_exists($file)) {
$this->stderr("Файл не найден: $file\n");
return 1; // Код ошибки
}
$handle = fopen($file, 'r');
$header = fgetcsv($handle); // Пропускаем заголовок
$count = 0;
while (($row = fgetcsv($handle)) !== false) {
$user = new User([
'username' => $row[0],
'email' => $row[1],
'status' => 10,
]);
if ($user->save()) {
$count++;
$this->stdout("Импортирован: {$row[0]}\n");
} else {
$this->stderr("Ошибка: " . implode(', ', $user->getErrors()) . "\n");
}
}
fclose($handle);
$this->stdout("Готово. Импортировано $count пользователей.\n");
return 0; // Успех
}
}Запускаем: ./yii import/csv /path/to/users.csv. Команда вернет 0 при успехе и 1 при ошибке. Это стандарт для консольных утилит.
Настройка маршрутизации и псевдонимы
Иногда длинные имена команд неудобны. Yii2 позволяет задавать псевдонимы через конфигурацию приложения (файл config/console.php).
'controllerMap' => [
'cron' => 'app\commands\CronController',
'import' => [
'class' => 'app\commands\ImportController',
'defaultAction' => 'csv', // Действие по умолчанию
],
],Теперь можно писать ./yii import вместо ./yii import/csv. Удобно для часто используемых команд.
Что в итоге
Консольные команды в Yii2 — это простой и мощный способ автоматизировать рутину. Вы можете создавать их за пару минут, передавать параметры, выводить прогресс и даже делать интерактивные скрипты. Главное — помнить про структуру: класс наследует Controller, методы — это действия. Используйте stdout/stderr для вывода, а prompt/select для ввода. И не забывайте про коды возврата: 0 — успех, 1 — ошибка.
Теперь вы можете написать свою первую команду. Начните с малого: например, команду для очистки старых логов. Потом переходите к более сложным задачам. Время — ваш самый ценный ресурс, а консольные команды помогают его экономить.

