Зачем Pulse реестр обработчиков
Каждый тип события получает обработчик, но switch из пятидесяти ветвей быстро станет общей точкой конфликтов. Реестр связывает каноническое имя с callable, принимающим Event и возвращающим Contribution. Неизвестное имя получает явный результат, а не случайный вызов функции из пользовательской строки.
Callable поступает из доверенной сборки приложения. Никогда не превращайте поле события непосредственно в имя функции или метода: allowlist реестра является границей возможностей.
Сборка реестра
Closure и захваченные значения
Замыкание по умолчанию захватывает значение через use, а & создаёт разделяемый изменяемый слот. Стрелочная функция автоматически захватывает внешние значения по значению. Захват большого контейнера продлевает его жизнь, поэтому callback worker не должен случайно удерживать весь batch.
First-class callable ClassName::method(...) создаёт Closure с проверяемой ссылкой на метод. Это яснее строковых массивов, но сигнатура всё равно должна соответствовать контракту реестра.
Атрибут — метаданные, не исполнение
Атрибут #[Handles('request.failed')] может назвать тип события. Reflection читает его, проверяет уникальность и создаёт обработчик через контейнер. Конструктор атрибута не должен выполнять сетевую операцию или изменять глобальное состояние.
Ошибку дублированного ключа лучше обнаружить на старте или в CI. Тихое правило «последний победил» делает поведение зависимым от порядка файлов и усложняет расследование.
PHP 8.5 и constant expressions
PHP 8.5 расширил применение статических closures и first-class callables в constant expressions, в том числе для некоторых сценариев атрибутов. Используйте возможность после обновления минимальной платформы и проверки migration guide.
Новая краткость не отменяет читаемость. Если attribute скрывает сложную маршрутизацию, отдельный конфигурационный объект и явный registry проще анализировать и тестировать.
Лаборатория
Создайте три обработчика Pulse и реестр с проверкой дублированного имени. Добавьте неизвестный event type и докажите, что пользовательская строка не может вызвать произвольную функцию.
- Registry строится из конечного allowlist.
- Дубликат ломает запуск.
- Callback не удерживает весь batch.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/manual/en/class.closure.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/manual/en/language.attributes.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .