我正在学习Phalcon(在multi-module应用程序模板中尝试REST API),并且我对每个请求进行了简单的检查,"此请求是否包含特定标头"例如x-api-key
(类似于ASP.NET MVC中的ActionFilters)。
我尝试使用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;
}
//...
}
似乎工作正常,但这不是一个优雅的解决方案而且我对此懒得:)
问题:您对PhalconPHP中的ActionFilters有什么更好的建议吗?
答案 0 :(得分:1)
查看cmoore4/phalcon-rest/HTTPException
上的解决方案当应用程序抛出HTTPError时,会修改响应对象以反映错误详细信息和标题并将其发送到输出。
我喜欢在REST实现上做很多事情的cmoore4方式。
答案 1 :(得分:0)
您可以使用匹配回调来检查您的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