ZF2 Restful 分级路由

ZF2 Restful hierarchical routes

我正在尝试将 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 调用了 AddressControllerget 方法,而不是 getList,我认为那是因为 Zend 知道client属于addresses,所以调用get方法

你知道怎么处理吗?

你可能是对的 get 被调用而不是 getList 因为 id 出现在你的路由匹配参数和 the controller by default uses 'id' for matching the route identifier.

处理此问题的方法是为路由标识符指定适合资源的名称。因此,对于客户,您使用 client_id,对于地址,您使用 address_id(就像您已经使用的那样)。

然后将 AbstractRestfulController 实例配置为 "look" 以获得正确的路由标识符 using the setIdentifierName method:

$clientController->setIdentifierName( 'client_id' );

$addressController->setIdentifierName( 'address_id' );

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