跳到内容

路由器

编辑此页

欢迎来到快速入门的第三部分。做得好,坚持到这里!这是一件好事,因为您将在本章中了解 CMF 的骨干:路由器。

CMF 的骨干

路由器是 CMF 的核心。要理解这一点,让我们看看 CMS 试图做什么。在一个普通的 Symfony 应用程序中,路由指的是一个控制器,它可以处理一个特定的实体。另一个路由指的是另一个控制器,它可以处理另一个实体。这样,路由就与控制器绑定在一起。事实上,使用 Symfony 核心,您也受到这种模式的限制。

但是,如果您查看 CMS 的基础,它只需要处理一种类型的实体:内容。因此,大多数路由不必再与控制器绑定,因为只需要一个控制器。路由必须与特定的内容对象绑定,而内容对象本身可能需要特定的模板和控制器。

CMF 的其他部分也与路由器相关。例如:菜单是通过使用路由器生成特定的路由来创建的,而区块是显示给特定路由的(因为它们与模板相关)。

从 PHPCR 树加载路由

在第一章中,您已经了解到路由是从数据库中使用特殊的 DynamicRouter 加载的。这样,并非所有路由都需要在每次请求时加载。

从 PHPCR 匹配路由非常简单:路由器获取请求路径并查找具有该路径的文档。一些例子

1
2
3
4
5
6
7
8
/cms
    /routes
        /en            # /en Route
            /company   # /en/company Route
                /team  # /en/company/team Route
            /about     # /en/about Route
        /de            # /de Route
            /ueber     # /de/ueber Route

好的,您明白了吗?路由器唯一要做的就是用特定的路径前缀来前缀路由,并加载该文档。在 RoutingBundle 的情况下,所有路由都以 /cms/routes 为前缀。

您看到像 /company/team 这样的路由,它由两个“路径单元”组成,在 PHPCR 树中有两个文档:companyteam

创建一个新的路由

现在您了解了路由的基础知识,您可以使用 Doctrine 向树中添加新路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// src/AppBundle/DataFixtures/PHPCR/LoadQuickTourData.php
namespace AppBundle\DataFixtures\PHPCR;

use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\ODM\PHPCR\DocumentManager;
use PHPCR\Util\NodeHelper;
use Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route;

class LoadQuickTourData implements FixtureInterface, OrderedFixtureInterface
{
    public function load(ObjectManager $documentManager)
    {
        // static content from model chapter, resulting in $content being defined
        // ...

        $routesRoot = $documentManager->find(null, '/cms/routes');
        $route = new Route();
        // set $routesRoot as the parent and 'new-route' as the node name,
        // this is equal to:
        // $route->setName('new-route');
        // $route->setParentDocument($routesRoot);
        $route->setPosition($routesRoot, 'new-route');

        $route->setContent($content);

        $documentManager->persist($route); // put $route in the queue
        $documentManager->flush(); // save it
    }
}

现在再次执行 doctrine:phpcr:fixtures:load 命令。

这将创建一个名为 /cms/routes/new-route 的新节点,当您访问 /new-route 时,它将显示我们的 quick_tour 页面。

链接多个路由器

通常,您既想为可编辑的路由使用 DynamicRouter,也想为您的自定义逻辑使用 Symfony 中的静态路由文件。为了能够做到这一点,CMF 提供了一个 ChainRouter。此路由器尝试每个注册的路由器,并在第一个返回匹配项的路由器上停止。

默认情况下,ChainRouter 会覆盖 Symfony 路由器,并且其链中只有核心路由器和动态路由器。您可以在配置中或通过使用 cmf_routing.router 标记路由器服务,向链中添加更多路由器。

最终想法

现在您已经到达本文的结尾,您可以说您真正了解 Symfony CMF 的基础知识。首先,您已经了解了请求流程,并快速学习了此过程中的每个新步骤。之后,您学习了更多关于默认存储层和路由系统的信息。

路由系统是与 Drupal 8 的一些开发人员一起创建的。事实上,Drupal 8 使用了 Symfony CMF 的路由组件。

这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本