Вы когда-нибудь тратили часы на однотипные действия: чистка кэша, отправка писем, импорт данных из 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();
Лайфхак: Всегда используйте stdout для обычного вывода и stderr для ошибок. Это позволяет перенаправлять логи в разные файлы: ./yii command 2>&1 | tee log.txt

Автоматизация с помощью консольных команд: пример с импортом 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. Удобно для часто используемых команд.

Правило: Всегда задавайте defaultAction для контроллера, если у него есть только одно действие. Это упрощает вызов.

Что в итоге

Консольные команды в Yii2 — это простой и мощный способ автоматизировать рутину. Вы можете создавать их за пару минут, передавать параметры, выводить прогресс и даже делать интерактивные скрипты. Главное — помнить про структуру: класс наследует Controller, методы — это действия. Используйте stdout/stderr для вывода, а prompt/select для ввода. И не забывайте про коды возврата: 0 — успех, 1 — ошибка.

Теперь вы можете написать свою первую команду. Начните с малого: например, команду для очистки старых логов. Потом переходите к более сложным задачам. Время — ваш самый ценный ресурс, а консольные команды помогают его экономить.

Студия WNDER