Model view controller 未找到控制器时通过默认控制器路由zend请求

Model view controller 未找到控制器时通过默认控制器路由zend请求,model-view-controller,zend-framework,bootstrapping,Model View Controller,Zend Framework,Bootstrapping,下面是我的引导类中定义的函数。我肯定在Zend做路由和调度的方式中遗漏了一些基本的东西。我试图完成的事情很简单:对于任何由于任何原因无法发送的请求,请尝试/index/foo/bar/*。我遇到的问题是当FooController存在时,我得到的操作“foo”不存在。基本上,isDispatchable总是错误的 public function run() { $front = Zend_Controller_Front::getInstance(); $requ

下面是我的
引导类中定义的函数。我肯定在Zend做路由和调度的方式中遗漏了一些基本的东西。我试图完成的事情很简单:对于任何由于任何原因无法发送的请求,请尝试
/index/foo/bar/*
。我遇到的问题是当
FooController
存在时,我得到的
操作“foo”不存在。基本上,
isDispatchable
总是错误的

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();
    }

如果我没弄错你的想法 你会尝试使用
\u调用
魔术方法吗??
然后使用
$this->_redirect()设置为默认操作

更多信息在这里

更新

如果在第480行打开Zend/Controller/Action.php

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);
    }
我想做的是扩展这个类并重写
\u call
函数

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 
        }
}
并确保控制器扩展新创建的类

class FooController extends My_Controller_Action
{
   public function indexAction()
    {
        // action body
    }
}
因此,如果您如何调用不存在的操作
\u调用
将运行 这个想法只是关于不存在的行动
如果控制器不存在,它将不起作用,因此这似乎是可行的,但不是最佳答案,因为它只是删除所有参数。我可能会很快尝试在插件中转发到
/index/[original uri]

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');
    }
  }
}

我不知道你指的是哪种方法?哪一班?更具体地说,本例中的控制器类不存在。我想引入一个新路由的原因是,这样我就可以重新开始循环,并让路由器正确地捕获接下来的所有内容
:action/
。然而,我意识到这不能在引导中完成,因为路由器和调度器还没有准备好。它认为我可能必须创建一个插件或其他东西。@brett我已经更新了我的答案,希望我的答案能帮助你