2010-04-27 9 views
0

Voici une fonction définie dans ma classe Bootstrap. Je dois manquer quelque chose de fondamental dans la façon dont Zend fait le routage et l'envoi. Ce que j'essaie d'accomplir est simple: Pour toute demande /foo/bar/* qui n'est pas dispatchable pour une raison quelconque, essayez /index/foo/bar/. Le problème que j'ai est quand le FooController existe je reçois Action "foo" does not exist. Fondamentalement, le isDispatchable est toujours faux.Routage de la requête zend via un contrôleur par défaut lorsque le contrôleur n'est pas trouvé

public function run() { 
     $front = Zend_Controller_Front::getInstance(); 
     $request = $front->getRequest(); 
     $dispatcher = $front->getDispatcher(); 
     //$controller = $dispatcher->getControllerClass($request); 
     if (!$dispatcher->isDispatchable($request)) { 
      $route = new Zend_Controller_Router_Route(
       ':action/*', 
       array('controller' => 'index') 
      ); 
      $router = $front->getRouter(); 
      $router->addRoute('FallBack', $route); 
     } 
     $front->dispatch(); 
    } 

Répondre

0

si je comprends votre bonne idée voulez-vous essayer d'utiliser __call méthode magique ?? puis utilisez $this->_redirect(); à votre action par défaut, par exemple

plus d'info ici sont http://php.net/manual/en/language.oop5.overloading.php

MISE À JOUR

si vous ouvriez Zend/Controller/action.php en ligne 480

public function __call($methodName, $args) 
    { 
     require_once 'Zend/Controller/Action/Exception.php'; 
     if ('Action' == substr($methodName, -6)) { 
      $action = substr($methodName, 0, strlen($methodName) - 6); 
      throw new Zend_Controller_Action_Exception(sprintf('Action "%s" does not exist and was not trapped in __call()', $action), 404); 
     } 

     throw new Zend_Controller_Action_Exception(sprintf('Method "%s" does not exist and was not trapped in __call()', $methodName), 500); 
    } 

ce que je voulais faire est d'étendre cette classe et de remplacer __call fonction exactement pour être

classs My_Controller_Action extends Zend_Controller_Action{ 
    public function __call($methodName, $args) 
     { 
      ///// do your magic here ......redirection or logging the request or what ever 
     } 
} 

et assurez-vous que votre contrôleur prolonger votre nouvelle classe

class FooController extends My_Controller_Action 
{ 
    public function indexAction() 
    { 
     // action body 
    } 
} 

donc si certains comment vous avez appelé l'action se déroulera __call inexistante cette idée était sur l'action que il inexistante ne fonctionnera pas si le le contrôleur n'existe pas

+0

Je ne suis pas sûr que la méthode '__call' vous voulez dire? Quelle classe? Plus précisément, la classe de contrôleur dans ce cas n'existe pas. La raison pour laquelle je veux introduire une nouvelle route est que je peux commencer la boucle et que le routeur attrape correctement tout ce qui suit ': action /'. Je réalise cependant que cela ne peut pas être fait dans bootstrap car le routeur et le répartiteur ne sont pas encore prêts. Il pense que je devrais créer un plugin ou quelque chose. –

+0

@brett j'avais mis à jour ma réponse j'espère que ma réponse vous aidera – tawfekov

0

Donc, cela semble fonctionner, mais ce n'est pas la meilleure réponse car il laisse simplement tomber tous les paramètres. Je pourrais essayer bientôt faire un avant à /index/[original uri] dans le plugin:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { 
    protected function _initRoute() { 
    $front = Zend_Controller_Front::getInstance(); 
    $routes = array(
     'FallBack' => new Zend_Controller_Router_Route(
     ':controller/:action/*', 
     array('controller' => 'index', 'action' => 'index') 
    ) 
    ); 
    $router = $front->getRouter(); 
    $router->removeDefaultRoutes(); 
    $router->addRoutes($routes); 
    $front->setRouter($router); 
    return $router; 
    } 

    protected function _initPlugin() { 
    $front = Zend_Controller_Front::getInstance(); 
    $front->registerPlugin(new My_Controller_Plugin_FallBack()); 
    } 
    } 

class My_Controller_Plugin_FallBack extends Zend_Controller_Plugin_Abstract { 
    public function preDispatch(Zend_Controller_Request_Abstract $request) { 
    $front = Zend_Controller_Front::getInstance(); 
    $dispatcher = $front->getDispatcher(); 
    $router = $front->getRouter(); 
    if (($router->getCurrentRouteName() == 'FallBack') && 
     !$dispatcher->isDispatchable($request)) { 
     $request->setActionName($request->getControllerName()); 
     $request->setControllerName('index'); 
    } 
    } 
}