0

我正在尝试为我们的 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 文档中似乎没有任何关于创建自定义路由器的信息。

我尝试扩展 Literal 路由器并通过覆盖match()函数并RouteMatch在找到匹配项时返回对象来创建我自己的路由器,但它仍然给我一个 404 并通知你没有匹配的路由。

module.config 文件当然也被编辑以添加新路由器。并将其添加到可调用对象中

谁能告诉我一些关于如何编写自定义路由器的初学者,或者有人知道有关这样做的任何好信息吗?

4

2 回答 2

1

不确定这是否是最好的方法。

您可以将所有 URLS 指向一个控制器,例如 /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',
        ...
    )
  ),
);
于 2013-05-30T09:36:50.360 回答
0

首先,我认为您的意思不是直接查找目录结构,是吗?你永远不应该那样做。如果您已正确配置应用程序,则不需要它,因为 zf2 会为您处理自动加载。

无论如何,有几种方法可以实现这一点。

  • 确实创建您的自定义路线类
  • 匹配以 /foo 开头的任何内容,并将其路由到 fe FooDispatchController,您可以在其中进一步分析RouteMatch对象并forward()从那里到适当的控制器。
于 2013-05-30T09:38:06.673 回答