0

我正在 Zend Framework 2 中构建 RESTful API。我的路线是article/person. 我知道如果id没有在 url 中传递,那么它将调用getList()方法,而不是get().

就我而言,我不id作为 get 或 post 参数传递,而是在 HTTP 标头中传递它。当我id用来执行数据库操作时,我希望它调用get()方法,而不是getList(). 我该如何调整代码来做到这一点?

是否可以指定要在路由中调用的确切方法名称?

4

3 回答 3

4

我不将 id 作为 get 或 post 参数传递,但我在 HTTP 标头中传递它

这确实使您的 REST 无效,因此它实际上不再是 REST。因此,您不能在没有自定义的情况下使用 RestfulAbstractController。

您可以编写自己的抽象控制器,也可以覆盖该getIdentifier方法

protected function getIdentifier($routeMatch, $request)
{
    $identifier = $this->getIdentifierName();
    $headers    = $request->getHeaders();

    $id = $headers->get($identifier)->getFieldValue();
    if ($id !== false) {
        return $id;
    }

    return false;
}

确保在每个控制器中设置正确的标识符名称。在这种情况下,标识符名称应与您正在使用的标头名称相匹配。

请注意,这将用于 GET、PUT、PATCH、DELETE 和 HEAD 请求,而不仅仅是 GET!

/编辑:

getIdentifier方法在流程中被调用,控制器确定运行哪个方法。通常是这样的:

  1. 控制器构造
  2. 控制器dispatch被调用(控制器是可调度的)
  3. dispatch触发事件“调度”
  4. 该方法onDispatch监听此事件
  5. 在 AbstractRestfulController 中,该方法尝试确定调用哪个方法

对于#5,它检查例如请求是否是GET 请求。如果是这样,它会检查是否有给定的标识符。如果是这样,get()则使用 。如果没有,getList()则使用 。“如果有给定的标识符”检查是用该getIdentifier()方法完成的。

如果您使用自己的抽象控制器扩展 AbstractRestfulController 并覆盖getIdentifier(),您可以确定自己的标识符。这样,您可以检查标头而不是路由参数或查询参数。

于 2014-01-02T09:01:53.117 回答
1

覆盖 AbstractRestfulController以能够调整与 id 相关的所有功能。

class YourController extends AbstractRestfulController {

    //in the constructor, ensure that your id name is set to the header variable you are using
    public function __construct() {
        $this->identifierName = 'id'; // Override $identifierName value specified in AbstractRestfulController, if you need it
    }

    protected function getIdentifier($routeMatch, $request)
    {

        //first of all, check if the id is set in the $routeMatch params, this is, in the normal way
        $id= parent::getIdentifier($routeMatch, $request);     
        if ($id !== false) {
            return $id;
        }

        //if the id its not set, check out the headers 
        $id =  $request->getHeaders()->get($this->getIdentifierName())->getFieldValue();
        if ($id !== false) {
            return $id;
        }

        return false;
    }

}
于 2014-01-03T00:22:53.017 回答
0

我认为最简单的方法是从 getList 方法调用 get 方法

public function getList(){
   // get id from header
   $id = $this->getRequest()->getHeaders()->get("id-header-field");
   if ($id){
       return $this->get($id);
   }
   else{ /* return list */}
}

public function get($id){
  return JsonModel($data);
}
于 2014-01-02T08:33:24.970 回答