Маршрутизация Zend-запроса через контроллер по умолчанию, когда контроллер не найден - PullRequest
0 голосов
/ 27 апреля 2010

Ниже приведена функция, определенная в моем классе Bootstrap. Должно быть, я упускаю что-то фундаментальное в том, как Zend выполняет маршрутизацию и диспетчеризацию. То, что я пытаюсь выполнить, просто: для любого запроса /foo/bar/*, который не может быть отправлен по какой-либо причине, попробуйте /index/foo/bar/. У меня проблема, когда существует FooController, я получаю Action "foo" does not exist. По сути, 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();
    }

Ответы [ 2 ]

0 голосов
/ 29 апреля 2010

Так что, похоже, это работает, но это не лучший ответ, поскольку он просто отбрасывает все параметры. Я мог бы в ближайшее время попытаться сделать переадресацию на /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');
    }
  }
}
0 голосов
/ 27 апреля 2010

если я правильно понял вашу идею, вы бы попробовали использовать __call магический метод ??затем используйте $this->_redirect(); для действия по умолчанию, например

дополнительная информация здесь http://php.net/manual/en/language.oop5.overloading.php

ОБНОВЛЕНИЕ

если вы открыли Zend / Controller /Action.php в строке 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);
    }

что я хотел сделать, это расширить этот класс и переопределить функцию __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
    }
}

, так что если некоторые, как вы называли несуществующее действие __call, запустят эту идею, речь идет о несуществующем действии, только если оно не будет работать, если контроллер не существует

...