Я изучаю Phalcon (пробую REST API в мульти-модуль шаблон приложения), и я сделал простую проверку для каждого запроса, «содержит ли этот запрос, например, определенный заголовок» x-api-key
(что-то вроде ActionFilters в ASP.NET MVC).
Я пытался сделать это с annotations
, plugins
, beforeExecuteRoute
, а также beforeException
. Но когда я пишу в одном из них throw new \Exception("Some exception", 500);
затем Phalcon возвращает пустую страницу без сообщения об исключении и кода. AFAIK это известная ошибка.
Я пытался сделать это с 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?
Посмотрите на решение на cmoore4 / Phalcon-отдых / HttpException
Когда приложение выдает HTTPError, это модифицирует объект ответа, чтобы отразить детали ошибки и заголовки и отправить его на выход.
Мне нравится cmoore4 способ делать много вещей в реализации REST.
Вы можете использовать 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