簡體   English   中英

ZF2自定義路由

[英]ZF2 custom routing

我正在嘗試為我們的ZF2應用程序設置路由。

我們有這樣的URL:

/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文檔中獲得有用的信息。 我看了看現有的路由器,但在我看來,這些路由器都不符合所需的功能。

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

我試圖通過覆蓋match()函數並返回RouteMatch對象(如果找到match()來擴展Literal路由器並創建我自己的路由器,但是它仍然給我一個404,提示您沒有匹配的路由。

當然也對module.config文件進行了編輯以添加新的路由器。 並將其添加到發票中

誰能告訴我一些有關如何編寫自定義路由器的入門資料,或者有人知道這樣做的任何好信息嗎?

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

您可以將所有URL指向一個控制器,例如/Controller/RouteController.php。 在這里您可以遍歷url並使適當的控制器失去路徑:

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',
        ...
    )
  ),
);

首先,我認為您的意思不是直接查找目錄結構,是嗎? 您絕對不應該那樣做。 如果您已經正確配置了應用程序,則不需要它,因為zf2為您處理了自動加載。

無論如何,有幾種方法可以實現這一目標。

  • 確實創建了定制的Route類
  • 匹配以/ foo開頭的任何內容,並將其路由到fe FooDispatchController,在其中您進一步分析RouteMatch對象,然后從那里forward()到適當的控制器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM