Pergunta

Com o Zend Framework, eu estou tentando rotas de construção para uma API REST em recursos organizados no seguinte padrão:

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top