Рубрики
Uncategorized

Работа с событиями в neoan3 (PHP)

События – это обычно то, что я использую в JavaScript. В конце концов, PHP классически не очень асинхронен… С тегами php, события, neoan3.

События – это обычно то, что я использую в 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”