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 понимает, что id клиента принадлежит адресам, поэтому он вызывает метод get.

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

0

Решение

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

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

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

$clientController->setIdentifierName( 'client_id' );

$addressController->setIdentifierName( 'address_id' );

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]