2010-04-27 2 views
0

아래는 내 Bootstrap 클래스에 정의 된 함수입니다. 젠드가 라우팅 및 디스패치하는 방식에있어 근본적인 것을 놓치고 있어야합니다. 내가 성취하려고하는 것은 간단합니다 : 어떤 이유로 든 파견 할 수없는 어떤 요청도 /foo/bar/* 일 경우 /index/foo/bar/을 시도하십시오. 내가 가지고있는 문제는 FooController이 존재하면 Action "foo" does not exist이됩니다. 기본적으로 isDispatchable은 항상 거짓입니다. 내가 당신의 생각을 이해한다면컨트롤러가 발견되지 않을 때 기본 컨트롤러를 통한 라우팅 zend 요청

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

답변

0

바로 당신은 __call 마법 방법을 사용하려고 할 ?? 다음 예를 들어 기본 동작에

더 많은 정보를 $this->_redirect();를 사용 여기 http://php.net/manual/en/language.oop5.overloading.php

UPDATE

당신은 줄에 젠드/컨트롤러/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 
    } 
} 

그래서이 아이디어는 inexistent 행동에 대해이었다 를 실행합니다 inexistent 행동 __call라는 방법 일부는 는 경우 작동하지 않을 경우 컨트롤러가 새로 만든 클래스를 확장해야합니다 컨트롤러가 존재하지 않습니다.

+0

어떤'__call' 메서드를 사용하고 있는지 확실하지 않습니다. 어떤 수업? 보다 구체적으로이 경우 컨트롤러 클래스는 존재하지 않습니다. 새로운 경로를 소개하고자하는 이유는 루프를 시작하고 라우터가': action /'다음에 오는 모든 것을 제대로 잡도록하기 위해서입니다. 그러나 라우터와 디스패처가 아직 준비되지 않았기 때문에 부트 스트랩에서이를 수행 할 수 없다는 것을 알고 있습니다. 그것은 내가 플러그인이나 뭔가를 만들어야 할 것 같아. –

+0

@brett 잘하면 내 대답은 당신을 도울 것입니다. – tawfekov

0

이렇게 작동하는 것처럼 보이지만 모든 매개 변수를 삭제하기 때문에 가장 좋은 대답은 아닙니다. 플러그인 내에서 잠시 후 /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'); 
    } 
    } 
}