跳到内容

概览

编辑此页

10 分钟开始使用 Symfony CMF!这个快速教程将带你了解 Symfony CMF 的基本概念,并帮助你入门。

重要的是要知道 Symfony CMF 是一系列扩展包的集合,这些扩展包提供了使用 Symfony Framework 构建 CMS 时所需的常用功能。在继续阅读之前,你应该至少具备 Symfony Framework 的基本知识。如果你不了解 Symfony,请先阅读 Symfony Framework 快速教程

解决框架与 CMS 两难困境

在开始一个新项目之前,会面临一个艰难的决定,即是基于框架还是基于 CMS。当选择使用框架时,你需要花费大量时间为项目创建 CMS 功能。另一方面,当选择使用 CMS 时,构建自定义应用程序功能会更加困难。自定义 CMS 的核心部分是不可能的,或者至少非常困难。

Symfony CMF 的创建是为了解决框架与 CMS 的两难困境。它提供了 Symfony 扩展包,可以轻松地将 CMS 功能添加到你的项目中。然而,由于你仍然在使用 Symfony 框架,你可以构建任何你能想到的自定义功能。这种灵活性被称为解耦 CMS

Symfony CMF 提供的扩展包可以协同工作,但它们也能够独立工作。这意味着你不需要添加所有扩展包,你可以决定只使用其中一个(例如,仅 RoutingBundle)。

下载 Symfony CMF 沙盒

为了探索 CMF,最好下载 Symfony CMF 沙盒。沙盒包含了许多 CMF 功能的演示,是一个熟悉 CMF 的良好场所。

当你想要使用 CMF 启动一个实际项目时,最好下载 Symfony CMF 标准版。Symfony CMF 标准版类似于 Symfony 标准版,但包含并配置了必要的 Symfony CMF 扩展包。

下载 Symfony CMF 沙盒的最佳方式是使用 Composer

1
$ composer create-project symfony-cmf/sandbox cmf-sandbox

设置数据库

现在,剩下唯一要做的就是设置数据库。这在你创建 Symfony 应用程序时通常不会做,但 Symfony CMF 需要数据库才能使用管理界面配置许多内容。

为了快速开始,我们假设你已经启用了 sqlite PHP 扩展。之后,运行以下命令

1
2
3
4
5
6
7
8
9
$ cd cmf-sandbox
$ cp app/config/phpcr_doctrine_dbal.yml.dist app/config/phpcr.yml
# Or when you're on a Windows PC:
# $ copy app\config\phpcr_doctrine_dbal.yml.dist app\config\phpcr.yml

$ php bin/console doctrine:database:create
$ php bin/console doctrine:phpcr:init:dbal --force
$ php bin/console doctrine:phpcr:repository:init
$ php bin/console doctrine:phpcr:fixtures:load -n

提示

你将在快速教程的下一章中了解更多关于 Symfony CMF 的数据库层。

运行 Symfony 应用程序

使用 server:run 命令为演示运行本地服务器。

运行 CMF 应用程序与运行任何 Symfony 应用程序相同,请参阅 Symfony 文档中的配置 Web 服务器

请求流程

现在,沙盒已准备就绪。导航到主页 (https://127.0.0.1:8000/) 查看演示

你看到我们的演示中已经有一个完整的网站。让我们仔细看看 Symfony CMF 应用程序的请求流程

首先,你看到一个典型的 Symfony 请求流程,遵循白色方块。它创建一个 Request 对象,该对象将传递给路由器,路由器执行控制器,而控制器使用模型生成视图以放入响应中。

在此之上,CMF 添加了绿色方块。在接下来的章节中,你将分别了解更多关于这些内容。

模型

在创建 CMF 之前,团队对使用哪个数据库做了大量研究。他们最终找到了 JCR,一个 Java 内容仓库。他们与其他一些开发人员一起创建了 PHPCR,JCR 规范的 PHP 端口。

PHPCR 使用类似目录的结构。它将元素存储在一个大树中。元素有父级,并且可以有子级。

注意

尽管 PHPCR 是 CMF 团队的首选,但这些扩展包并不局限于特定的存储系统。一些扩展包还提供 ORM 集成,你也可以轻松添加自己的模型。

路由器

在 Symfony 中,路由存储在配置文件中。这意味着只有开发人员才能更改路由。在 CMS 中,你希望管理员更改其站点的路由。这就是 Symfony CMF 引入 DynamicRouter 的原因。

DynamicRouter 从数据库加载一些可能与请求匹配的路由,然后尝试找到完全匹配的路由。可以使用管理界面编辑、删除和创建数据库中的路由,因此一切都在管理员的完全控制之下。

因为你可能还需要其他路由器,例如普通的 Symfony 路由器,所以 CMF 还提供了一个 ChainRouter。链式路由器包含其他路由器的链,并按给定的顺序执行它们以找到匹配项。

使用数据库存储路由也使得从路由引用其他文档成为可能。这意味着路由可以有一个 Content 对象。

注意

你将在快速教程的后续内容中了解更多关于路由器的信息。

控制器

当路由匹配时,将执行控制器。此控制器通常只从路由获取 Content 对象并呈现它。由于几乎总是相同的,CMF 使用一个通用的控制器来执行它。可以通过为路由或 Content 对象设置特定的控制器来覆盖它。

视图

使用 RoutingBundle,你可以配置哪些 Content 对象由特定的模板或控制器呈现。然后,通用控制器将呈现此模板。

视图还使用由 KnpMenuBundle 提供的菜单,并且它可以与 Create.js 集成,以进行实时编辑。

固定数据

现在你了解了请求流程,你可以开始编辑内容了。虽然正常用法是通过 Web 界面编辑内容,但 CMF 沙盒也支持从静态文件加载内容。这主要用于测试目的。

固定数据通过 doctrine:phpcr:fixtures:load 命令加载。要编辑主页,请编辑 src/AppBundle/Resources/data/page.yml 中的第一个条目,使其说一些不同的内容。然后,运行 doctrine:phpcr:fixtures:load 命令以将更改加载到内容仓库中。刷新浏览器后,你可以看到你的修改!

不用担心,编辑固定数据文件仅用于开发和测试。CMF 带有 Sonata 管理集成,方便在线编辑,或者你可以构建自己的编辑系统。

最终想法

恭喜你!你已经完成了 Symfony CMF 的首次介绍。还有更多内容等待你发现,但你应该已经看到 Symfony CMF 如何通过提供一些 CMS 扩展包来改善你作为开发人员的生活。如果你想了解更多,你可以深入到下一节:“模型”。

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