ZF2 Restful分层路由

时间:2016-01-28 11:10:27

标签: php rest routing zend-framework2 hierarchical

我正在尝试在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方法。

你知道怎么处理这个吗?

1 个答案:

答案 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' );

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