События – это обычно то, что я использую в JavaScript. В конце концов, PHP классически не очень асинхронен, и независимо от того, насколько объектно-ориентированно вы работаете, в конце вы просто абстрагируете процедурный поток.
Наблюдения
Однако при работе с neoan3 вы заметили пару необычных закономерностей. Особенно при использовании встроенного API REST вы часто используете настраиваемое “Исключение маршрута”.:
component/item/Item.ctrl.php
...
function getItem($item)
{
if (!isset($item['id'])) {
throw new RouteException('Missing field "id"', 400);
}
return ItemModel::byId($item['id']);
}
Что здесь происходит?
Если мы не предоставляем идентификатор, API отвечает правильно сформированной ошибкой и заголовком 400. Давайте подумаем об этом: до нашей конечной точки “элемент” API, по-видимому, пытается выполнить наш код и улавливает исключение, чтобы отреагировать. Таким образом, в некотором смысле мы предоставляем ранее выполненный ввод кода. Это не слишком необычно с точки зрения архитектуры, но у этого есть свои пределы:
Что делать, если я хочу выполнить пользовательское поведение?
Недавно мне понадобилось внедрить политику CORS, чтобы разрешить определенные вызовы на основе домена, и я заметил, что API не учитывает это. Довольно легко включить мою собственную оболочку API, и, похоже, лучший подход – просто избегать “api.v1” и создавать свои собственные? Возможно, но ядро выдает событие, когда API получает вызов, который мы можем прослушать. Это функции, которыми мы располагаем в вашем распоряжении:
// To emit an event: \Neoan3\Core\Event::dispatch($eventName, $params =[]) // To listen to an event: \Neoan3\Core\Event::listen($eventName, $callBackFunction) // Listing emitted events: \Neoan3\Core\Event::getFiredEvents() // Listing registered listeners: \Neoan3\Core\Event::getRegisteredListeners()
Справедливо, но как это поможет нам решить нашу проблему? Как упоминалось ранее, ядро само использует эти события, и мы можем просто слушать их. В этом случае событие Ядро \\Api::входящий – это то, что мне нужно было подключить. В самом простом примере я могу открыть default.php файл и добавить:
...
\Neoan3\Core\Event::listen('Core\\Api::incoming', function (){
header('Access-Control-Allow-Origin: https://my-domain.com');
});
И вуаля, теперь функция обратного вызова выполняется всякий раз, когда API получает вызов.
Конечно, функциональность событий на самом деле предназначена для использования для пользовательских событий (с менее неудобными именами событий?) в вашей бизнес-логике, но давайте рассмотрим некоторые полезные события, которые запускает ядро neoan3:
До направления на 404
Ядро\\Маршрут::не найден
Это событие выдает массив в качестве параметра, содержащего “компонент”. Или, другими словами, конечная точка, которую намеревался посетить ссылка/пользователь. Хотя вы можете легко определить свой собственный ответ 404 в neoan3, это простой способ добавить дополнительную логику (например, ведение журнала) к вызову 404.
интерфейс прикладного программирования: До возврата JSON клиенту
Ядро\\Api::перед ответом
Параметр этого события содержит ответ (в виде массива, запускаемый перед преобразованием в JSON), а также код ответа (обычно 200, если вызов не является недействительным) и позволяет выполнять дополнительную (или условную) логику более высокого уровня (допустим, у ваших пользователей есть квота API, например).
интерфейс прикладного программирования: События с ошибками
Ядро\\Api::ошибка
Это событие содержит сообщения об ошибках, на которые вы можете реагировать. Современные приложения могут реагировать с помощью интерфейсной логики, но, возможно, вы хотите ограничить запросы, блокировать IP-адреса и т. Д. На стороне сервера.
До чего-нибудь?
Ядро::перед началом
Итак, это вызывает недоумение: ядро выдает это событие (опять же с запрошенным компонентом) после установки переменных и автоматической загрузки, но ДО ТОГО, КАК будет выполнено ЧТО-ЛИБО ЕЩЕ. Я понятия не имею, что вы можете с этим сделать, но теоретически вы можете выполнить что-то вроде “промежуточного программного обеспечения для ядра”.
Оригинал: “https://dev.to/sroehrl/working-with-events-in-neoan3-php-48o7”