2010-03-05 121 views
3

如您所知,Zend Framework(v1.10)使用基於斜槓分隔參數的路由,例如。基於標準PHP查詢字符串的路由

[server]/controllerName/actionName/param1/value1/param2/value2/ 

Queston是:如何強制Zend框架,使用標準的PHP查詢字符串以檢索動作和控制器的名稱,在這種情況下:

[server]?controller=controllerName&action=actionName&param1=value1&param2=value2 

我已經試過:

protected function _initRequest() 
{ 
    // Ensure the front controller is initialized 
    $this->bootstrap('FrontController'); 

    // Retrieve the front controller from the bootstrap registry 
    $front = $this->getResource('FrontController'); 

    $request = new Zend_Controller_Request_Http(); 
    $request->setControllerName($_GET['controller']); 
    $request->setActionName($_GET['action']); 
    $front->setRequest($request); 

    // Ensure the request is stored in the bootstrap registry 
    return $request; 
} 

但它不適合我。

回答

3
$front->setRequest($request); 

該行只設置請求對象實例。 frontController仍然通過路由器運行請求,在該路由器中分配要調用的控制器/操作。

您需要創建自己的路由器:

class My_Router implements Zend_Controller_Router_Interface 
{ 
    public function route(Zend_Controller_Request_Abstract $request) 
    { 
     $controller = 'index'; 
     if(isset($_GET['controller'])) { 
      $controller = $_GET['controller']; 
     } 

     $request->setControllerName($controller); 

     $action = 'index'; 
     if(isset($_GET['action'])) { 
      $action = $_GET['action']; 
     } 

     $request->setActionName($action); 
    } 
}} 

然後在你的引導:

protected function _initRouter() 
{ 
    $this->bootstrap('frontController'); 
    $frontController = $this->getResource('frontController'); 

    $frontController->setRouter(new My_Router()); 
} 
+0

它幾乎工作,我不得不從Zend_Controller_Router_Rewrite擴展My_Router或實現其餘的接口方法。第一種解決方案更快;)現在它工作得很好。謝謝! – singles 2010-03-06 15:14:24

+0

根據手冊,你應該只需要實現該方法。該API似乎說不然,所以我很困惑。你也可以嘗試擴展Zend_Controller_Router_Abstract而不是Zend_Controller_Router_Rewrite。他們在手冊中需要一個更好的例子。 – smack0007 2010-03-06 16:13:35

1

您是否嘗試過:$router->removeDefaultRoutes(),然後$request->getParams()$request->getServer()