Como configurar rotas hierárquica Zend resto?
-
18-09-2019 - |
Pergunta
Com o Zend Framework, eu estou tentando rotas de construção para uma API REST em recursos organizados no seguinte padrão:
- http://example.org/users/
- http://example.org/users/234
- http://example.org/users/234/items
- http://example.org/users/234/items/34
Como faço para configurar isso com Zend_Rest_Route?
Aqui está como eu tenho a configuração da rota para o recurso usuários (usuários /: id) no meu arquivo bootstrap.php:
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$restRoute = new Zend_Rest_Route($frontController);
$frontController->getRouter()->addRoute('default', $restRoute);
[Tanto quanto eu entendo, este é um prendedor toda rota para que os usuários / 324 / itens / 34 teria resultado em parâmetros definidos como id = 324 e itens = 34 e tudo iria ser mapeados para os Utilizadores (módulo frontal) Modelo . . De lá, eu acho que eu poderia apenas teste para o parâmetro de itens e recuperar o item # 34 para o usuário # 324 sobre um pedido get] <=== Eu verifiquei e ele não parece funcionar assim:
Acessando / users / 234 / itens / 43 e
var_dump($this->_getAllParams());
na ação get dos resultados do controlador de descanso no seguinte resultado:
array(4) {
["controller"]=> string(5) "users"
["action"]=> string(3) "get"
[2]=> string(5) "items" ["module"]=> string(7) "default"]
}
De alguma forma, ambos os ids se perdeu ...
Qualquer um?
Solução
AFAIK, não há recurso no Zend_Rest_Route que lhe permite fazer algo assim. Há uma proposta, mas não sei quando ele vai ser implementado. Você pode adicionar este em sua Bootstrap para configurar esta rota personalizada.
$front = $this->getResource('FrontController');
$testRoute = new Zend_Controller_Router_Route(
'users/:user_id/items/:item_id',
array(
'controller' => 'users',
'action' => 'item',
'module' => 'default'
)
);
$front->getRouter()->addRoute('test', $testRoute);
user_id ou item_id se tornar disponível em itemAction em UsersController como parâmetros:
$user_id = $this->_request->getParam('user_id');
Outras dicas
I código aberto a solução no github e como um pacote compositor. consulte https://github.com/aporat/Application_Rest_Controller_Route .
Eu adicionei uma nova classe que se estende Zend_Controller_Router_Route e acrescenta abiliy adicionar rotas costume repousante, como
$frontController = Zend_Controller_Front::getInstance();
$frontController->getRouter()->addRoute('users-messages', new Application_Rest_Controller_Route($frontController, 'users/:user_id/messages', ['controller' => 'users-messages']));
Zend_Rest_Route mapeia o primeiro parâmetro após o nome do controlador para 'id' apenas quando há um parâmetro.
A melhor solução que eu vim acima com é a subclasse Zend_Rest_Route e substituir a função match (). função partida de cópia Zend_Rest_Route, mas adicione as seguintes pouco antes do comentário "Digest URI Params" (cerca de 60 linhas in).
if($pathElementCount > 1 && $path[0] != 'id') {
$params['id'] = urldecode($path[0]);
array_shift($path);
}
Isso deve dar-lhe a funcionalidade que você está procurando.