2013-05-30 144 views
0

我正在嘗試爲我們的ZF2應用程序設置路由。ZF2自定義路由

我們URLS這樣的:

/foo/bar.json   >>> should call /Controller/Foo/BarController.php 
/foo/bar/123.json  >>> should call /Controller/Foo/BarController.php 
/foo/baz/bar.json  >>> should call /Controller/FooController.php 

和墊層控制器結構

/Controller/Foo/BarController.php 
/Controller/FooController.php 

它應該通過路由在目錄結構中進行查找。因此/foo/baz/bar.json應該看起來 如果/Controller/Foo/Baz/BarController.php存在。如果沒有,看,如果/Controller/Foo/BazController.php存在,否則找/Controller/FooController.php和其他給予404

但是我似乎並沒有得到從Zend文檔mutch有用的信息。我查看了現有的路由器,但在我看來,它們中的任何一個都不符合所需的功能。

也有似乎沒有在有關創建自定義路由器zend的文檔的任何信息。

我試圖延長文字路由器,通過重寫match()功能,如果找到匹配返回RouteMatch對象創建一個我自己的,但它仍然給了我一個404一個通知,你是沒有匹配的路由。

的module.config文件ofcourse還編輯添加新的路由器。並把它添加到invokables

誰能告訴我如何編寫自定義的路由器或有沒有人知道這樣做有什麼好處信息的一些首發?

回答

1

不知道這是否是最好的方法。

您可以將所有的URL指向一個控制器,例如/Controller/RouteController.php。在那裏你可以遍歷URL和dispath適當的控制器:

public function indexAction() 
{ 
    $event = $this->getEvent(); 
    $routeMatch = $event->getRouteMatch(); 

    $locator = $this->getServiceLocator(); 
    if ($locator->has('ControllerLoader')) { 
     $locator = $locator->get('ControllerLoader'); 
    } 

    $url = parse_url($this->getRequest()->getUri()); 
    $path = str_replace('.json', '', $url['path']); 
    $path = explode('/', trim($path, '/')); 

    while (sizeof($path)){ 
     $controllerName = 'Controller\\' .implode('\\', $path); 
     if ($locator->has($controllerName)) { 
      return $this->forward()->dispatch($controllerName, $routeMatch->getParams()); 
     } 

     array_pop($path); 
    } 

    //not found 
} 

一定要定義你的控制器模塊配置:

array(
    'controllers' => array(
    'invokables' => array(
     'Controller\Foo\Baz' => 'Controller\Foo\BazController', 
     ... 
    ) 
), 
); 
+0

我已經作出這樣的結構,但我想擺脫控制器玩是一個路由器。 ;) – nvanesch

0

首先,我不認爲你的意思是直接仰視目錄結構,你呢?你永遠不應該這樣做。如果你已經正確配置你的應用程序,你將不需要它,因爲zf2爲你處理自動加載。

反正有實現這幾方面。

  • 事實上創建自定義路由類
  • 匹配任何以/ foo和路由到F.E.啓動FooDispatchController,您可以在其中進一步分析RouteMatch對象和forward()到適當的控制器。
+0

但是我如何創建自定義路由器? – nvanesch