ZF2自定义路由

时间:2013-05-30 08:46:32

标签: php zend-framework2

我正在尝试为我们的ZF2应用程序设置路由。

我们有这样的网址:

/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文件以添加新路由器。并将其添加到invokables

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

2 个答案:

答案 0 :(得分:1)

不确定这是否是最佳方式。

您可以将所有网址指向一个控制器,例如/Controller/RouteController.php。在那里你可以遍历网址并调度相应的控制器:

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

答案 1 :(得分:0)

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

无论如何,有几种方法可以达到这个目的。

  • 确实创建了自定义的路线类
  • 匹配以/ foo开头的任何内容并将其路由到f.e. FooDispatchController,您可以在其中进一步分析RouteMatch对象和forward()到适当的控制器。