Свои команды 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, а не из имени класса.