在每个http请求上调用一个函数

时间:2015-02-28 11:47:56

标签: php zend-framework2 apigility

在我的Apigility项目中,我有不同的Rest资源,所有这些都扩展了我的ResourseAbstract类,并在那里扩展了AbstractResourceListener作为Apigility的需求。

例如我的资源用户:

<?php
namespace Marketplace\V1\Rest\User;

use ZF\ApiProblem\ApiProblem;
use Marketplace\V1\Abstracts\ResourceAbstract;

class UserResource extends ResourceAbstract
{
    public function fetch($id)
    {
        $result = $this->getUserCollection()->findOne(['id'=>$id]);
        return $result;
    }
}

和ResourceAbstract:

<?php

namespace Marketplace\V1\Abstracts;

use ZF\Rest\AbstractResourceListener;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use ZF\ApiProblem\ApiProblem;

class ResourceAbstract extends AbstractResourceListener implements ServiceLocatorAwareInterface {

}

现在,我需要在每次发出http请求时运行一个函数,如果我在浏览器中查询/用户,UserResource类将被实例化,那么ResourceAbstract,我的&#34;解决方案&#34;要在每次调用中运行一些东西,就是在ResourceAbstract中使用构造函数,这个&#34;工作&#34;:

function __construct() {
    $appKey = isset(getallheaders()['X-App-Key']) ? getallheaders()['X-App-Key'] : null;
    $token = isset(getallheaders()['X-Auth-Token']) ? getallheaders()['X-Auth-Token'] : null;
    //some code
    return new ApiProblem(400, 'The request you made was malformed');
}

问题是我需要在某些情况下返回ApiProblem(http请求上的错误标头),但正如您所知,构造函数不返回参数。另一个解决方案是抛出一个异常,但是在Apigility中你应该在有api问题时才能成为ApiProblem。构造函数方法是否正确?你将如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

抛出异常将是一个解决方案,只要你在代码的父部分捕获它。

您是否在您的apigility项目中使用ZEND MVC?

如果是,您可以考虑挂接将在MVC执行调度之前执行的调用。

如果您想了解该方法的可行性,可以在stackoverflow上检查问题:Zend Framework 2 dispatch event doesn't run before action

答案 1 :(得分:0)

我没有使用过这个库,但是通过扩展'dispatch'方法或者添加自己的高优先级事件监听器看起来好像you can attach a listener to 'all' events。然后控制器listens for the returned 'ApiProblem'

附加一个监听器可能是一个更好的主意,在你的自定义类AbstractResourceListener中(或从它的服务工厂内),你可以附加事件。

abstract class MyAbstractResource extends AbstractResourceListener
{

    public function attach(EventManagerInterface $eventManager)
    {
        parent::attach($eventManager);

        $eventManager->attach('*', [$this, 'checkHeaders'], 1000);
    }

    public function checkHeaders(EventInterface $event)
    {
        $headers = getallheaders();

        if (! isset($headers['X-App-Key'])) {

            return new ApiProblem(400, 'The request you made was malformed');
        }

        if (! isset($headers['X-Auth-Token'])) {

            return new ApiProblem(400, 'The request you made was malformed');
        }
    }
}

上述意味着触发的任何事件都会首先检查标头是否已设置,如果没有,则返回新的ApiProblem