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
调用了 AddressController
的 get
方法,而不是 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' );
这只是一个示例,最好的方法(当然)是使用控制器工厂...
我正在尝试将 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
调用了 AddressController
的 get
方法,而不是 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' );
这只是一个示例,最好的方法(当然)是使用控制器工厂...