我正在 Zend Framework 2 中构建 RESTful API。我的路线是article/person
. 我知道如果id
没有在 url 中传递,那么它将调用getList()
方法,而不是get()
.
就我而言,我不id
作为 get 或 post 参数传递,而是在 HTTP 标头中传递它。当我id
用来执行数据库操作时,我希望它调用get()
方法,而不是getList()
. 我该如何调整代码来做到这一点?
是否可以指定要在路由中调用的确切方法名称?
我正在 Zend Framework 2 中构建 RESTful API。我的路线是article/person
. 我知道如果id
没有在 url 中传递,那么它将调用getList()
方法,而不是get()
.
就我而言,我不id
作为 get 或 post 参数传递,而是在 HTTP 标头中传递它。当我id
用来执行数据库操作时,我希望它调用get()
方法,而不是getList()
. 我该如何调整代码来做到这一点?
是否可以指定要在路由中调用的确切方法名称?
我不将 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
方法在流程中被调用,控制器确定运行哪个方法。通常是这样的:
dispatch
被调用(控制器是可调度的)dispatch
触发事件“调度”onDispatch
监听此事件对于#5,它检查例如请求是否是GET 请求。如果是这样,它会检查是否有给定的标识符。如果是这样,get()
则使用 。如果没有,getList()
则使用 。“如果有给定的标识符”检查是用该getIdentifier()
方法完成的。
如果您使用自己的抽象控制器扩展 AbstractRestfulController 并覆盖getIdentifier()
,您可以确定自己的标识符。这样,您可以检查标头而不是路由参数或查询参数。
覆盖 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;
}
}
我认为最简单的方法是从 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);
}