Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Свои команды

Не всё на сайте происходит по запросу из браузера: рассылку, очистку старых записей, ночной отчёт запускают из терминала или по расписанию. Для таких задач пишут свои команды — они запускаются так же, как встроенные: 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 не найдётся, и задача молча не выполнится. Всегда указывайте переход в папку проекта и проверяйте запуск вручную той же строкой.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.