Encodera

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

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

Оглавление

Свои команды spark

Кроме встроенных команд у spark могут быть ваши собственные: разослать письма, удалить старые черновики, пересчитать статистику. Команда — класс, который запускают из терминала, а не из браузера, поэтому она может работать долго. Команды лежат в папке app/Commands.

Создание команды

php spark make:command PostsCount

Команда создаёт файл app/Commands/PostsCount.php. Заполните свойства и метод run():

// app/Commands/PostsCount.php
namespace App\Commands;
 
use App\Models\PostModel;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
 
class PostsCount extends BaseCommand
{
    protected $group = 'Blog';
    protected $name = 'posts:count';
    protected $description = 'Показывает число статей';
 
    public function run(array $params)
    {
        $total = model(PostModel::class)->countAllResults();
 
        CLI::write("Статей в блоге: $total");
    }
}

$name — имя, под которым команда вызывается, $group — раздел в списке php spark, $description — подпись в этом списке. CLI::write() печатает строку в терминал.

Запуск

php spark posts:count

Терминал напечатает «Статей в блоге: 20». Регистрировать команду нигде не нужно: CodeIgniter сам находит классы в app/Commands.

Аргументы и параметры

Аргументы — значения после имени команды, они приходят в массиве $params. Параметры пишут с двумя дефисами и читают через CLI::getOption():

// app/Commands/PostsClean.php
protected $name = 'posts:clean';
protected $usage = 'posts:clean [days] [--dry]';
 
public function run(array $params)
{
    $days = (int) ($params[0] ?? 30);
    $date = date('Y-m-d H:i:s', time() - $days * 86400);
 
    $posts = model(PostModel::class)->where('status', 0)->where('created_at <', $date);
 
    if (CLI::getOption('dry')) {
        CLI::write('Будет удалено: ' . $posts->countAllResults());
 
        return;
    }
 
    $posts->delete();
    CLI::write('Черновики удалены', 'green');
}
php spark posts:clean 60 --dry

Команда сообщит, сколько черновиков старше 60 дней было бы удалено, но ничего не тронет. Без --dry черновики удаляются.

Вывод в терминал

МетодЧто делает
CLI::write('текст', 'green')Печатает строку, при желании цветом
CLI::error('текст')Печатает сообщение об ошибке
CLI::prompt('Продолжить?', ['y', 'n'])Задаёт вопрос и возвращает ответ
CLI::table($rows, $headers)Печатает таблицу
CLI::newLine()Пустая строка

Запуск по расписанию

Чтобы команда выполнялась сама, её добавляют в планировщик сервера cron. Строка ниже запускает очистку каждую ночь в три часа:

0 3 * * * cd /var/www/blog && php spark posts:clean 60

Первые пять полей — минута, час, день месяца, месяц и день недели.

Частая ошибка

Команда не появляется в списке php spark, если у класса не заданы $group и $name или пространство имён не совпадает с папкой. Файл app/Commands/PostsCount.php должен содержать namespace App\Commands; и класс PostsCount. Имя для вызова берётся из свойства $name, а не из имени класса.

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

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