Phalcon ActionFilters

Я изучаю Phalcon (пробую REST API в мульти-модуль шаблон приложения), и я сделал простую проверку для каждого запроса, «содержит ли этот запрос, например, определенный заголовок» x-api-key (что-то вроде ActionFilters в ASP.NET MVC).

  1. Я пытался сделать это с annotations, plugins, beforeExecuteRoute, а также beforeException. Но когда я пишу в одном из них throw new \Exception("Some exception", 500); затем Phalcon возвращает пустую страницу без сообщения об исключении и кода. AFAIK это известная ошибка.

  2. Я пытался сделать это с dispatcher в beforeException:

     public function beforeException($event, $dispatcher, $exception)
{
if ($exception instanceof \Phalcon\Http\Request\Exception)
{
$dispatcher->forward(
array(
'controller' => 'error',
'action' => 'showInternalServerError'
)
);
return false;
}
//...
}

и кажется, что это работает, но это не элегантное решение, и я слишком ленив для этого 🙂

ВОПРОС: Есть ли у вас лучшие идеи, как сделать ActionFilters в PhalconPHP?

2

Решение

Посмотрите на решение на cmoore4 / Phalcon-отдых / HttpException

Когда приложение выдает HTTPError, это модифицирует объект ответа, чтобы отразить детали ошибки и заголовки и отправить его на выход.

Мне нравится cmoore4 способ делать много вещей в реализации REST.

1

Другие решения

Вы можете использовать Match Callbacks для проверки вашего ключа API:

Предположим, у вас есть следующий маршрут:

$router->add('/api/v1', array(
'module'     => 'api',
'controller' => 'index'
))

Вы можете добавить к нему проверку следующим образом:

$router->add('/api/v1', array(
'module'     => 'api',
'controller' => 'index'
))
->beforeMatch(array(new AuthenticationFilter(), 'check'));

А в своем собственно созданном AuthenticationFilter вы можете проверить действительный ключ API:

<?php

class AuthenticationFilter
{

public function check($uri, $route)
{
$response = new \Phalcon\Http\Response();

if ($response->getHeaders()->get('X-Api-Key') != 'XYZ')
{

throw new CustomAuthenticationErrorExteption('Api Key Invalid');

// you can also just return false here and redirect to a default non-authenticated 404 response

}

else return true;

}

}

Ссылка

https://docs.phalconphp.com/en/latest/reference/routing.html#match-callbacks

0

По вопросам рекламы [email protected]