Свои команды
Не всё на сайте происходит по запросу из браузера: рассылку, очистку старых записей, ночной отчёт запускают из терминала или по расписанию. Для таких задач пишут свои команды — они запускаются так же, как встроенные: bin/cake имя.
Создание
Команды лежат в папке src/Command:
bin/cake bake command Stats// src/Command/StatsCommand.php
namespace App\Command;
use Cake\Command\Command;
use Cake\Console\Arguments;
use Cake\Console\ConsoleIo;
class StatsCommand extends Command
{
public function execute(Arguments $args, ConsoleIo $io): int
{
$io->out('Привет из команды!');
return static::CODE_SUCCESS;
}
}Код команды находится в методе execute(). Объект $io печатает текст в терминал. Метод возвращает код завершения: CODE_SUCCESS — всё хорошо, CODE_ERROR — ошибка.
Запуск
bin/cake statsИмя команды получается из имени класса: StatsCommand — stats, SendReportCommand — send_report. В терминале появится «Привет из команды!».
Работа с базой
public function execute(Arguments $args, ConsoleIo $io): int
{
$total = $this->fetchTable('Articles')->find()->count();
$io->out("Статей в базе: $total");
return static::CODE_SUCCESS;
}В команде нет $this->Articles, поэтому таблицу получают через fetchTable(). Дальше с ней работают как в контроллере.
Аргументы и ключи
Аргумент — обязательное значение после имени команды, ключ — необязательная настройка с двумя дефисами. Их описывают в отдельном методе:
use Cake\Console\ConsoleOptionParser;
protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
{
return $parser
->addArgument('email', ['help' => 'Куда отправить отчёт', 'required' => true])
->addOption('limit', ['help' => 'Сколько статей', 'default' => '10']);
}
public function execute(Arguments $args, ConsoleIo $io): int
{
$email = $args->getArgument('email');
$limit = (int) $args->getOption('limit');
$io->success("Отчёт по $limit статьям отправлен на $email");
return static::CODE_SUCCESS;
}bin/cake stats admin@example.com --limit=5Команда напечатает «Отчёт по 5 статьям отправлен на admin@example.com». Тексты help показывает bin/cake stats --help.
Вывод
| Метод | Что делает |
|---|---|
$io->out('…') | Печатает строку |
$io->success('…') | Зелёное сообщение об успехе |
$io->warning('…') | Предупреждение |
$io->error('…') | Сообщение об ошибке |
$io->ask('Продолжить?') | Задаёт вопрос и возвращает ответ |
Запуск по расписанию
На сервере команды запускает планировщик cron. Строку добавляют командой crontab -e:
0 9 * * 1 cd /var/www/blog && bin/cake stats admin@example.comОтчёт будет уходить каждый понедельник в девять утра.
Частая ошибка
Cron запускает команду не из папки проекта и с другим набором переменных окружения. Без cd /var/www/blog && в начале строки bin/cake не найдётся, и задача молча не выполнится. Всегда указывайте переход в папку проекта и проверяйте запуск вручную той же строкой.