路由器
欢迎来到快速入门的第三部分。做得好,坚持到这里!这是一件好事,因为您将在本章中了解 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 树中有两个文档:company
和 team
。
创建一个新的路由
现在您了解了路由的基础知识,您可以使用 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 的路由组件。