Phalcon ActionFilters

时间:2014-10-14 09:25:17

标签: php api phalcon phalcon-routing

我正在学习Phalcon(在multi-module应用程序模板中尝试REST API),并且我对每个请求进行了简单的检查,"此请求是否包含特定标头"例如x-api-key(类似于ASP.NET MVC中的ActionFilters)。

  1. 我尝试使用annotationsplugins beforeExecuteRoute beforeException 。但是当我在其中一个throw new \Exception("Some exception", 500);中写入时,Phalcon会返回一个没有异常消息和代码的空白页面。 AFAIK这是一个已知的错误。

  2. 我尝试使用 dispatcher 中的beforeException

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

    似乎工作正常,但这不是一个优雅的解决方案而且我对此懒得:)

    问题:您对PhalconPHP中的ActionFilters有什么更好的建议吗?

2 个答案:

答案 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