我正在Zend Framework 2中构建RESTful API。我的路由是article/person
。我知道如果未在网址中传递id
,则会调用getList()
方法,而不是get()
。
在我的情况下,我没有将id
作为get或post参数传递,但我在HTTP标头中传递它。当我使用id
执行数据库操作时,我希望它调用get()
方法,而不是getList()
。我怎样才能调整代码来做到这一点?
是否可以指定要在路由中调用的确切方法名称?
答案 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
方法,控制器确定要运行的方法。通常,它是这样的:
dispatch
(控制器可以调度)dispatch
触发事件"发送" onDispatch
侦听此事件对于#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);
}