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

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);
Foi útil?

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.

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