Я пытаюсь использовать иерархический ресурс в 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.
Вы знаете, как с этим бороться?
Вы, вероятно, правы, что get
называется вместо getList
из-за id
присутствовать в параметрах соответствия вашего маршрута и контроллер по умолчанию использует 'id'
для сопоставления идентификатора маршрута.
Способ решения этой проблемы заключается в том, что вы даете имена идентификаторов маршрута, которые соответствуют ресурсу. Так что для клиента вы делаете client_id
и для адреса вы используете address_id
(как вы уже сделали).
И тогда вы настраиваете AbstractRestfulController
экземпляр для «поиска» правильного идентификатора маршрута с использованием setIdentifierName
метод:
$clientController->setIdentifierName( 'client_id' );
$addressController->setIdentifierName( 'address_id' );
Это всего лишь пример, лучший способ сделать это (конечно) с помощью фабрики контроллеров …
Других решений пока нет …