我正在尝试在ZF2中使用Restful API的分层资源。资源应该看起来像clients/1/addresses
。我试过的是这个
'clients' => array(
'type' => 'segment',
'options' => array(
'route' => '/clients[/:id]',
'constraints' => array(
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Api\Controller\ClientController',
),
),
'may_terminate' => true,
'child_routes' => array(
'addresses' => array(
'type' => 'segment',
'options' => array(
'route' => '/addresses[/:address_id]',
'constraints' => array(
'address_id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Api\Controller\AddressController',
),
),
),
),
),
这两个id都存在冲突,但我不知道是否重命名资源地址的路由标识id
,就像我解决它一样。无论如何,真正的问题是路由clients/1/addresses
调用get
的{{1}}方法,而不是AddressController
,我认为这是因为Zend理解了客户端属于地址,因此它调用get方法。
你知道怎么处理这个吗?
答案 0 :(得分:2)
由于您的路线匹配参数the controller by default uses 'id'
for matching the route identifier中存在get
,因此getList
被调用而不是id
可能是正确的。
处理此问题的方法是提供适合资源的路径标识符名称。因此,对于客户端,您需要client_id
,对于地址,您使用address_id
(就像您已经做过的那样)。
然后将AbstractRestfulController
实例配置为“查找”正确的路由标识using the setIdentifierName
method:
$clientController->setIdentifierName( 'client_id' );
$addressController->setIdentifierName( 'address_id' );
这只是一个例子,最好的办法是(当然)使用控制器工厂......