ZF2 Restful иерархические маршруты

Я пытаюсь использовать иерархический ресурс в 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 адресов ресурсов, как я это сделал, решу его. В любом случае, реальная проблема заключается в том, что маршрут clients/1/addresses вызывает метод get маршрута AddressController, а не getList, и я думаю, это потому, что Zend понимает, что идентификатор клиента принадлежит адресам, поэтому вызывает метод get.

Вы знаете, как с этим бороться?


person Rodrigo Otavio    schedule 28.01.2016    source источник


Ответы (1)


Вероятно, вы правы в том, что get вызывается вместо getList, потому что id присутствует в параметрах сопоставления вашего маршрута и контроллер по умолчанию использует 'id' для сопоставления идентификатора маршрута.

Способ справиться с этим заключается в том, что вы даете имена идентификаторов маршрутов, которые соответствуют ресурсу. Итак, для клиента вы делаете client_id, а для адреса используете address_id (как вы уже делали).

Затем вы настраиваете свой экземпляр AbstractRestfulController на поиск правильного идентификатора маршрута используя метод setIdentifierName:

$clientController->setIdentifierName( 'client_id' );

$addressController->setIdentifierName( 'address_id' );

Это всего лишь пример, лучший способ сделать это (конечно) с помощью фабрики контроллеров...

person Wilt    schedule 28.01.2016