Zend Framework: Removendo as rotas predefinidas
-
07-07-2019 - |
Pergunta
Eu estou usando Zend FW 1.9.2, deseja desativar o rotas padrão e fornecer o meu próprio. I realmente não gostam do default /: controller /:. Ação de roteamento
A idéia é injetar rotas na inicialização, e quando o pedido não pode ser encaminhado para uma das rotas injetados devem ser transmitidas para o controlador de erro. (Usando o defaultly registere Zend_Controller_Plugin_ErrorHandler)
Isso tudo funciona bem, até para desativar as rotas padrão com $ router-> removeDefaultRoutes (); Quando faço isso, o controlador de erro rotas já não unrouted pedidos para o controlador de erro. No lugar, ele encaminha todas as solicitações unrouted para indexAction no controlador de padrão.
Alguém tem alguma idéia de como desativar o default /: controller /:? Action roteamento, mas manter a manipulação de erro de rota ??p>
Basicamente, é isso que eu faço:
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$router->removeDefaultRoutes(); // <-- when commented, errorhandling works as expected
$route = new Zend_Controller_Router_Route_Static(
'',
array('controller' => 'content', 'action' => 'home')
);
$router->addRoute('home', $route);
Solução
O problema quando você remover as rotas padrão é que Zend não entende o urls /: module /: controller /: action, então sempre que uma rota é enviado, ele é encaminhado para o padrão Módulo, índice Controller, índice de Ação.
O erro plugin funciona no método postDispath da expedição controlador e ele funciona porque no roteador padrão se o controlador, ou módulo, ou ação não for encontrado, ele lança um erro.
Para ativar rotas personalizadas nesta configuração que você deve escrever um novo plugin que obras no preDispatch, e verifique se a rota e, em seguida, redirecionar para o plugin erro no evento é um URL inválido.
Outras dicas
Quando você remove as rotas padrão, remover a rota padrão que o manipulador de erro do plugin utiliza. Isto significa que quando ele tenta rota para
array('module' => 'default, 'controller' => 'error', 'action' => 'index')
nenhuma das suas rotas corresponder a esta configuração. Assim ele vai falhar. Eu suponho que você poderia adicionar apenas esta rota a partir do padrão assim:
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$router->removeDefaultRoutes(); // <-- when commented, errorhandling works as expected
// Re-add the error route
$router->addRoute(
'error',
new Zend_Controller_Router_Route (
'error/:action',
array (
'controller' => 'error',
'action' => 'error'
)
)
);
$route = new Zend_Controller_Router_Route_Static(
'',
array('controller' => 'content', 'action' => 'home')
);
$router->addRoute('home', $route);
Eu encontrei o mesmo problema para um aplicativo antigo, aqui é o que resolveu o meu problema:
$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter();
$route = new Zend_Controller_Router_Route('*', array('controller'=>'error', 'module'=>'error', 'action'=>'notfound'));
$router->addRoute('default', $route);
// After that add your routes.
Você precisa adicionar essa rota pela primeira vez como ele precisa ser o último processado.
E em ErrorController I definido:
public function notfoundAction()
{
throw new Zend_Controller_Action_Exception('This page does not exist', 404);
}
Desta forma, qualquer rota que não corresponde às nossas rotas usará o manipulador de erro padrão.