События, хуки и фоновые задачи
Подписка на события ядра и магазина, вывод своего HTML в тему, задачи планировщика.
События
Подписчик — класс с EventSubscriberInterface в src/; autoconfigure регистрирует его сам.
final class Notify implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
FormSubmitted::class => 'onForm',
'NewCMS\\Shop\\Event\\OrderPlaced' => 'onOrder',
];
}
}
Полезные события:
| Событие | Когда |
|---|---|
EntrySavingEvent, EntrySavedEvent, EntryDeletedEvent | запись меняется |
FormSubmitted | заявка с формы сохранена (с источником визита) |
ModuleEnabledEvent, ModuleDisabledEvent | модули |
OrderPlaced, OrderPaid, OrderStatusChanged, VariantsChanged, ShopLeadCreated | магазин |
LeadOutcome | CRM сообщила итог заявки |
Если модуль не требует магазина, подписывайтесь на события магазина по имени класса строкой — без магазина они просто не придут. Слушатель не должен бросать исключения в запрос посетителя: ловите и пишите в лог.
Хуки темы
HookProviderInterface выводит HTML в точки темы: head, body_top, body_bottom и другие.
final class Widget implements HookProviderInterface
{
public function supports(string $hook): bool { return $hook === 'body_bottom'; }
public function priority(): int { return 0; }
public function render(string $hook, array $context): string { return '<div id="my-widget"></div>'; }
}
Фоновые задачи
Задача — ScheduledTask: описание с интервалом и бюджетом времени и метод run().
final class SyncTask implements ScheduledTask
{
public function definition(): TaskDefinition
{
return new TaskDefinition('mymodule.sync', interval: 300, budget: 30.0, label: 'Sync with …');
}
public function run(TaskContext $context): TaskResult
{
// работайте, пока $context->remaining() > 0
return TaskResult::ok('Synced 12');
}
}
Задачи выполняются после ответа посетителю или по cron (cms:schedule:run). Время ограничено — делите работу на порции и продолжайте в следующий запуск. Состояние задач видно в «Настройки сайта → Система → Фоновые задачи».
Очередь в CRM и сервисы
Для отправки во внешние системы ядро даёт Integration\Outbox (очередь с повторами), Integration\Links (связь записи с объектом во внешней системе), Integration\IntegrationLog (журнал) и Integration\IntegrationHttp (HTTPS с белым списком хостов и защитой от SSRF).