Zend Framework 2 REST API:想要调用get()而不是getList()

时间:2013-12-31 10:33:43

标签: php rest zend-framework2 zend-rest zend-rest-route

我正在Zend Framework 2中构建RESTful API。我的路由是article/person。我知道如果未在网址中传递id,则会调用getList()方法,而不是get()

在我的情况下,我没有将id作为get或post参数传递,但我在HTTP标头中传递它。当我使用id执行数据库操作时,我希望它调用get()方法,而不是getList()。我怎样才能调整代码来做到这一点?

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

3 个答案:

答案 0 :(得分:4)

  

我没有将id作为get或post参数传递,但我将其传递给HTTP标头

这确实使您的REST无效,因此它实际上不再是REST。因此,如果没有自定义,则无法使用RestfulAbstractController。

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

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

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

    return false;
}

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

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

/编辑:

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

  1. 构建控制器
  2. 调用控制器dispatch(控制器可以调度)
  3. dispatch触发事件"发送"
  4. 方法onDispatch侦听此事件
  5. 在AbstractRestfulController中使用方法tries to determine which method to call
  6. 对于#5,它检查例如请求是否为GET request。如果是,则检查是否有an identifier given。如果是,则使用get()。如果不是,则使用getList()。 "如果有一个标识符"检查是使用getIdentifier()方法完成的。

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

答案 1 :(得分: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;
    }

}

答案 2 :(得分: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);
}