2012-08-15 153 views
0

我只是Zend的新手,我對Zend路由器有點麻煩。我搜索了它,但沒有發現...Zend控制器路由器:定義變量以指向一個控制器中的不同動作

我想能夠定義一個路由器爲每個定義的變量在uri級別指向一個控制器中的不同動作。

我與郎和模塊,所以我在系統啓動的應用程序定義的下一個initRoutes功能工作:

protected function _initRoutes() 
{ 
    $front = Zend_Controller_Front::getInstance(); 
    $router = $front->getRouter(); 

    $defaultRoute = new Zend_Controller_Router_Route(
     ':lang/:module/:controller/:action', 
     array(
      'lang' => 'es', 
      'module' => 'default', 
      'controller' => 'index', 
      'action' => 'index' 
     ), 
     array(
      'lang' => '^(en|es)$', 
      'module' => '^(default|admin)$' 
     ) 
    ); 

    $router->addRoute('defaultRoute', $defaultRoute); 

    return $router; 
} 

我希望能夠通過自己定義的操作來訪問論壇板塊和論壇主題。

喜歡的東西:

  • MYDOMAIN /論壇 - >論壇/指數

  • MYDOMAIN /論壇/節 - >論壇/ sectionAction

  • MYDOMAIN /論壇/節/話題 - > forum/topicAction

還有lang和modul向在URI級別等來定義:

  • MYDOMAIN /郎/模塊/論壇

  • MYDOMAIN /郎/模塊/論壇/部分

  • MYDOMAIN /郎/模塊/論壇/部分/話題

所以我有這樣的:

class ForumController extends Zend_Controller_Action 
{ 

public function indexAction() 
{ 
} 

public function sectionAction() 
{ 
} 

public function topicAction() 
{ 
} 

然後,我創建的下一個路由Default_Bootstrap內:

$forumRoutes = new Zend_Controller_Router_Route(
    ':lang/:module/forum', 
    array(
     'lang' => 'es', 
     'module' => 'default', 
     'controller' => 'forum', 
     'action' => 'index' 
    ) 
); 

$sectionRoutes = new Zend_Controller_Router_Route(
    ':lang/:module/forum/:section', 
    array(
     'lang' => 'es', 
     'module' => 'default', 
     'controller' => 'forum', 
     'action' => 'section', 
     'section' => '' 
    ) 
); 

$topic = new Zend_Controller_Router_Route(
    ':lang/:module/forum/:section/:topic', 
    array(
     'lang' => 'es', 
     'module' => 'default', 
     'controller' => 'forum', 
     'action' => 'topic', 
     'section' => '', 
     'topic' => '' 
    ) 
); 

$router->addRoute('forumTopics', $topic); 
$router->addRoute('forumSections', $section); 
$router->addRoute('forum', $forumRoutes); 

現在,這隻能如果我定義了郎和URI層次的模塊,但如果我喜歡=> MYDOMAIN /論壇定義不起作用/ section |部分/主題。這也爲我的導航 - >菜單帶來了另一個問題。如果我在路由器定義中將「forum」定義爲靜態變量,那麼當我將鼠標懸停在navigatoin.xml中定義的任何標籤上時,uri級別對於其中的每個標籤都具有相同的值。

我試圖做一個鏈條是這樣的:

$forumRoutes = new Zend_Controller_Router_Route(
     ':lang/:module/forum', 
     array(
      'lang' => 'es', 
      'module' => 'default', 
      'controller' => 'forum', 
      'action' => 'index' 
     ) 
    ); 

    $section = new Zend_Controller_Router_Route(
     ':section', 
     array(
      'action' => 'section', 
      'section' => '' 
     ) 
    ) 

    $topic = new Zend_Controller_Router_Route(
     ':topic', 
     array(
      'action' => 'topic', 
      'topic' => '' 
     ) 
    ) 

    $chainedRoute = new Zend_Controller_Router_Route_Chain(); 
    $chainedRoute->chain($topic) 
       ->chain($section) 
       ->chain($forumRoutes); 
    $router->addRoute($chainedRoute); 

但正如我所料,這並不工作。

任何幫助,將不勝感激,謝謝。

回答

2

你是Zend的新手。你說的。因此,這裏有一些解釋:

  1. 理想的Zend的應用程序的URL是:

example.com/controller/action/param-name/:param-value

所以在這種情況下,如果在UsersController下有一個名爲Edit的動作,它將是:

example.co M /用戶/編輯

如果動作增加,這將是:

example.com/users/add

當你指定第一個參數作爲一個變量,它會與控制器請求衝突。例如:如果你說控制器是用戶,但第一個參數接受一個值並把它放在emplyees中,那麼作爲example.com/employees和example.com/user的請求都會指向員工控制器,即使usercontroller存在!這又是一個理論!

你可能想要做的是,讓路由只接受動態值而非路由!您不希望用戶路由您的應用程序,而是將用戶路由到應用程序的不同部分。

關於語言,那麼你需要使用Zend_Locale這將檢查是

<html lang="nl"> or <html lang = "en">

希望的事情是清楚的HTML語言! :)

+0

哦,我看到了,謝謝你的回覆,但我想要做的事情是:取決於URI上有多少個參數,我將使用Controller_Action進行渲染。所以我可以在路由器級別定義,如果論壇控制器得到的第一個參數將用「sectionAction」渲染,如果我有兩個參數,我將使用「topicAction」渲染,我只需要做一些事情,比如'public function sectionAction(){$ section = $ this - > _ request-> getParam('section'); // @ TODO:從Db獲取並呈現}'這可以通過Zend_Controller_Router完成嗎? – Ramiro 2012-08-15 19:38:50

+0

我在codeIgniter中做了這樣的事情,在路由配置上我設置了一個像'$ routes ['forum /(az)'] ='forum/section''這樣的數組,並且匹配第二個參數只需添加一個新的路由器過濾器例如:'$ routes ['forum /(az)/(az)'] ='forum/topic''這可能與Zend Routers相匹配嗎?像重定向,但只獲取uri參數並重定向到所需的操作。 – Ramiro 2012-08-15 20:06:43

+0

Codeigniter使用基於段的檢查,而zend檢查請求!所以沒有'segment'這樣的東西,但是,使用Request-Param獲取東西...在這裏,正如我所提到的,您將不得不重新計劃應用程序......動作來自控制器...示例,用戶控制器可以查看,添加,修改,刪除..路線用於例如路線 - 「我的儀表板」路由到用戶控制器 - 工具和選項操作...很酷? – Karma 2012-08-15 21:27:44

1

下面是一個快速的例子,它應該可以幫助你使用類似ZF的路線。

如果您使用默認的項目結構,比如使用Zend Tool啓動新項目時獲得的默認項目結構,請進入Application文件夾。

在你的bootstrap.php設置是這樣的:

protected function _initRouteBind() { 
     // get the front controller and get the router 
     $front = Zend_Controller_Front::getInstance(); 
     $router = $front->getRouter(); 
     // add each custom route like this giving them a descriptive name 
     $router->addRoute(
      'addTheDescriptiveRouteNameHere', 
      new Zend_Controller_Router_Route(
       '/:controller/:id/:action/:somevar', 
       array(
        'module'  => 'default', 
        'controller' => ':controller', 
        'action'  => ':action', 
        'id'   => ':id', 
        'somevar' => ':somevar' 
       ) 
      ) 
     ); 
} 

上面我的例子只是爲了說明你將如何使用,其中控制器,動作和幾個參數的設定的路線網址。

控制器和行動應該沒有任何額外的工作來解決然而拿到「身份證」或「somevar」值,你可以在你的控制器做到這一點:

public function yourAction() 
{ 
    // How you get the parameters to pass in to a function 
    $id = $this->getRequest()->getParam('id'); 
    $somevar = $this->getRequest()->getParam('somevar'); 

    // Using the parameters 
    $dataYouWant = $this->yourAmazingMethod($id); 
    $somethingElse = $this->yourOtherAmazingMethod($somevar); 

    // Assign results to the view 
    $this->view->data = $dataYouWant; 
    $this->view->something = $somethingElse; 
}  

所以,當你將要確保你的方法處理所傳遞的參數(畢竟它是用戶提供的信息),這是利用路由參數綁定的原理。你當然可以做'/ site'作爲路由,並將它直接指向CMS模塊或控制器,然後再用'/ site /:id',其中'id'是頁面標識符。

也只是說一個不錯的替代品:

$id = $this->getRequest()->getParam('id'); 
$somevar = $this->getRequest()->getParam('somevar'); 

這是不是很好本身無論如何,因爲它是假設一個參數是要被傳遞,結合使用速記條件語句與動作助手是:

$id = ($this->_hasParam('id')) ? $this->_getParam('id') : null; 
$somevar = ($this->_hasParam('somevar')) ? $this->_getParam('somevar') : null; 

如果你不熟悉這一點,

($this->_hasParam('id')) 

是條件測試,如果true指定':'左側的任何值的值,並且如果false指定':'右側的任何值。

所以,如果真賦值將

$this->_getParam('id') 

和空如果爲假。 這有幫助嗎? :-D