Php ZF2 Restful分层路由

Php ZF2 Restful分层路由,php,rest,routing,zend-framework2,hierarchical,Php,Rest,Routing,Zend Framework2,Hierarchical,我正在尝试将ZF2中的分层资源用于Restful API。该资源应类似于客户端/1/地址。我试过的就是这个 'clients' => array( 'type' => 'segment', 'options' => array( 'route' => '/clients[/:id]', 'constraints' => array( 'id' => '[0-9]+',

我正在尝试将ZF2中的分层资源用于Restful API。该资源应类似于
客户端/1/地址
。我试过的就是这个

'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
调用
AddressController
get
方法,而不是
getList
,我认为这是因为Zend知道客户端的id属于地址,所以它调用get方法


您知道如何处理此问题吗?

您可能是对的,因为
id
存在于您的路线匹配参数中,因此调用
get
而不是
getList

处理这一问题的方法是,提供适合资源的路由标识符名称。所以对于客户,您使用
客户id
,对于地址,您使用
地址id
(就像您已经做的那样)

然后将
AbstractRestfulController
实例配置为“查找”正确的路由标识符:


这只是一个例子,最好的方法是(当然)通过使用控制器工厂…

您可能是对的,调用
get
而不是
getList
,因为
id
存在于路由匹配参数中

处理这一问题的方法是,提供适合资源的路由标识符名称。所以对于客户,您使用
客户id
,对于地址,您使用
地址id
(就像您已经做的那样)

然后将
AbstractRestfulController
实例配置为“查找”正确的路由标识符:

这只是一个例子,最好的方法是(当然)使用控制器工厂

$clientController->setIdentifierName( 'client_id' );

$addressController->setIdentifierName( 'address_id' );