0

在我的 Apigility 项目中,我有不同的 Rest 资源,它们都扩展了我的类 ResourseAbstract,并且在那里我根据 Apigility 的需要扩展了 AbstractResourceListener。

因此,例如我的资源用户:

<?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;
    }
}

和资源摘要:

<?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 请求时,我都需要运行一个函数,如果我在浏览器中查询 /user,UserResource 类将被实例化,因此 ResourceAbstract,我在每次调用时运行某些东西的“解决方案”是使用ResourceAbstract 中的构造函数,它“有效”:

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。构造函数方法是否正确?你将如何解决这个问题?

4

2 回答 2

0

我没有使用过这个库,但是它看起来好像您可以通过扩展“调度”方法或添加您自己的具有高优先级的事件侦听器来将侦听器附加到“所有”事件。然后控制器监听返回的 '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返回新的。

于 2015-02-28T16:08:35.437 回答
0

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

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

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

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

于 2015-02-28T15:09:59.993 回答