Вы когда-нибудь задумывались, как автоматизировать рутинные задачи в вашем проекте на Yii2? Консольные команды — это мощный инструмент, который позволяет выполнять скрипты прямо из терминала, без веб-интерфейса. В этой статье я расскажу, как создавать свои команды, передавать им параметры и избегать типичных ошибок. Поехали!

Что такое консольные команды в Yii2?

Консольные команды в Yii2 — это специальные классы, которые наследуются от yii\console\Controller. Они работают в командной строке, например, для очистки кэша, отправки email-рассылок или импорта данных. Это как обычный контроллер, но без HTML-шаблонов и с доступом к консольному вводу-выводу.

Пример простой команды:

<?php
namespace app\commands;

use yii\console\Controller;

class HelloController extends Controller
{
    public function actionIndex()
    {
        echo "Hello, World!\n";
    }
}

Чтобы запустить её, в терминале нужно выполнить: php yii hello. Команда выведет "Hello, World!" и завершится.

Создание своей первой команды

Давайте создадим команду, которая будет логировать события. Предположим, нам нужно записывать время запуска в файл. Создаём класс LoggerController в папке commands.

<?php
namespace app\commands;

use yii\console\Controller;
use Yii;

class LoggerController extends Controller
{
    public function actionLog()
    {
        $message = date('Y-m-d H:i:s') . ' - Команда выполнена';
        file_put_contents(Yii::getAlias('@runtime/logs/command.log'), $message . PHP_EOL, FILE_APPEND);
        echo "Лог записан.\n";
    }
}

Теперь запускаем php yii logger/log. В папке runtime/logs появится файл с записью. Просто и эффективно.

Правило: Всегда используйте метод Yii::getAlias() для указания путей, чтобы команда работала на любом сервере без правок.

Передача аргументов и опций

Часто нужно передавать данные в команду. Например, указать, какой именно лог писать. В Yii2 это делается через аргументы и опции. Аргументы — это обязательные параметры, опции — необязательные с дефолтными значениями.

Пример с аргументом:

public function actionLog($message = 'default')
{
    echo "Сообщение: $message\n";
}

Запуск: php yii logger/log "Мое сообщение". Если не передать значение, будет использовано 'default'.

Опции задаются через свойства класса:

public $verbose = false;

public function options($actionID)
{
    return ['verbose'];
}

public function actionLog()
{
    if ($this->verbose) {
        echo "Подробный вывод\n";
    }
}

Запуск с опцией: php yii logger/log --verbose=1. Опции удобны для настройки поведения.

ТипОписаниеПример
АргументОбязательный параметр в порядке вызоваphp yii command arg1
ОпцияНеобязательный параметр с именемphp yii command --name=value

Взаимодействие с пользователем

Консольные команды могут запрашивать ввод от пользователя. Это полезно для подтверждения опасных операций. Yii2 предоставляет методы prompt() и confirm().

public function actionDeleteAll()
{
    $confirm = $this->confirm('Вы уверены, что хотите удалить все данные?');
    if ($confirm) {
        // удаление
        echo "Данные удалены.\n";
    } else {
        echo "Операция отменена.\n";
    }
}

При запуске php yii my/delete-all появится запрос: Вы уверены, что хотите удалить все данные? [yes/no]:. Пользователь вводит ответ.

Лайфхак: Используйте confirm() для всех деструктивных операций (очистка БД, удаление файлов). Это спасёт от случайных ошибок.

Работа с миграциями в консоли

Yii2 поставляется с встроенными консольными командами для миграций. Они находятся в классе yii\console\controllers\MigrateController. Основные команды:

  • php yii migrate — применить новые миграции.
  • php yii migrate/create create_user_table — создать новую миграцию.
  • php yii migrate/down — откатить последнюю миграцию.

Эти команды работают из коробки, но их можно кастомизировать. Например, указать другую папку для миграций через опцию --migrationPath=@app/migrations.

Обработка ошибок и коды завершения

Консольные команды могут возвращать коды завершения. 0 — успех, любое другое число — ошибка. Это важно для автоматизации, когда скрипты проверяют результат.

public function actionCheck()
{
    if (some_condition) {
        echo "Ошибка\n";
        return 1;
    }
    echo "Успех\n";
    return 0;
}

В терминале можно проверить код: echo $? после выполнения команды.

Правило: Всегда возвращайте код 0 при успехе и 1 при ошибке. Это стандарт для Unix-систем.

Что в итоге?

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

Помните: консольные команды — не магия, а инструмент. Чем чаще вы их применяете, тем быстрее ваш проект становится гибким и управляемым.

Студия WNDER