2016-01-22 116 views
0

我遇到了將自定義路由添加到我的應用程序的問題。 Zend Framework 1:Zend Framework 1爲路由添加單個自定義規則

我已經在使用默認的Zend路由工作。我有很多的控制器和他們中的一些我想要使用友好的URL,例如: domain.com/cities/edit/ ID/3 到 domain.com/cities/edit/ 阿布扎比

有一些控制器切換到該網址(以該格式)。

我試圖通過ini文件進行配置:

resources.router.routes.slugurl.route = /:controller/:action/:slug 

並且還通過Bootstrap方法:

protected function _initSlugRouter() 
{ 
    $this->bootstrap('FrontController'); 
    $router = $this->frontController->getRouter(); 
    $route = new Zend_Controller_Router_Route('/:controller/:action/:slug/', 
     array(
      'controller' => 'slug', 
      'action' => 'forward', 
      'slug' => ':slug' 
     ) 
    ); 
    $router->addRoute('slug',$route); 

} 

的主要問題 - 與INI配置 - 請求,直接轉到控制器城市(不決高下)。第二個(引導) - 還執行了城市控制器,但默認路由不工作,因爲它是,我不能夠執行: domain.com/cities/但domain.com/cities/index/作品。定義如果不採取行動的錯誤:

Action "forward" does not exist and was not trapped in __call() 

我可以監視控制器中的「彈頭」 /移動檢查到一些圖書館,但我想只能用路由做 - 這樣看起來更適合我。請,如何解決這個問題?


編輯用的解決方案總結 感謝您最大P.有趣。我終於解決了它 - 在最後2分鐘:)我在路由的application.ini中有錯誤的規則。現在,它的定義是:

resources.router.routes.slugurl.route = /:controller/:action/:slug 
resources.router.routes.slugurl.defaults.controller = :controller 
resources.router.routes.slugurl.defaults.action = :action 
resources.router.routes.slugurl.defaults.slug = :slug 

控制器這樣的定義:

class CitiesController extends Crm_Abstract 

的Crm_Abstract具有代碼:

<?php 

class Crm_Abstract extends Zend_Controller_Action { 

    public function __construct(\Zend_Controller_Request_Abstract $request, \Zend_Controller_Response_Abstract $response, array $invokeArgs = array()) { 

     $params = $request->getParams(); 

     if (!empty($params['slug'])) { 
      $modelSlug = Crm_Helper_Slug::getInstance(); 
      $parameters = $modelSlug->redirectRequest($request); 
      if ($parameters !== false) { 
       foreach ($parameters as $key => $value) { 
        $request->setParam($key, $value); 
       } 
      } 
     } 
     parent::__construct($request, $response, $invokeArgs); 

    } 

    public function __call($methodName, $args) { 

     parent::__call($methodName, $args); 
    } 


} 

嵌塞助手在規定的控制器得到蛞蝓參數。訪問slug的URL被定義/計算,代替$ this-> url - 到$ this-> slug,其餘代碼在slug helper中完成。我不確定我的解決方案是否100%確定,因爲這是我第一次使用路由。

主要的事情是 - 我只是需要改變依靠Zend_Controller_Action到Crm_Abstract延伸的依靠Zend_Controller_Action。單行 - 每個控制器中不需要額外的自定義代碼。

+0

如果評論這條路線是什麼錯誤出現URL domain.com/城市/編輯/阿布扎比? –

+0

我會添加錯誤,只是當我將得到有效的錯誤代碼 - 我無法格式化它在評論:( – Mik

+0

我仍然無法理解ZF路由 - 總是隻有一件事不太好 - 當我添加路由: 'resources.router.routes.slugurl.route = /:controller /:action /:slug' 'resources.router.routes.slugurl.defaults.controller =:controller' 'resources.router.routes.slugurl。 defaults.action =:action' 'resources.router.routes.slugurl.defaults.slug =:slug' 我無法訪問url:domain.com/developers/ - 錯誤代碼:Action「action」不存在並沒有陷入__call() - 它看起來像添加該路由規則 - 破壞默認路由,但我希望它保持。 – Mik

回答

1

我創建了兩個路徑規則:

resources.router.routes.slugurl.type = "Zend_Controller_Router_Route" 
resources.router.routes.slugurl.route = /:controller/:action/:slug/ 
resources.router.routes.slugurl.defaults.module = "default" 
resources.router.routes.slugurl.defaults.controller = :controller 
resources.router.routes.slugurl.defaults.action = :action 
resources.router.routes.slugurl.defaults.slug = :slug 


resources.router.routes.plain1.route = "/:controller/:action/" 
resources.router.routes.plain1.defaults.module = "default" 
resources.router.routes.plain1.defaults.controller = "index" 
resources.router.routes.plain1.defaults.action = "index" 

而對於現在工作得很好。糟糕的事情 - 我不明白路由(htaccess的規則),但時間上的問題花費並解決它比修改所有的控制器......