步骤 2: 项目介绍

我们需要找一个项目来开发,这可是个不小的挑战。我们需要一个足够大的项目,可以涵盖 Symfony 的方方面面;但同时它又需要足够小,我不希望你去重复开发类似的功能,那会让你感到厌倦。

揭开项目的面纱

鉴于本书要在阿姆斯特丹的 Symfony 大会上发布,如果该项目和 Symfony 以及会议这些概念有点关联,这会是个不错的主意。做一个 留言本 的项目,你觉得如何? 在法语里,我们把留言本称为 livre d’or。在2019年,开发一个留言本会有种老派和过时的感觉,我喜欢这感觉!

那就用这个主题了。这个项目围绕着从会议上收集反馈:首页上是一个会议列表,每个会议有自己的页面,上面有很多友善的评论。每个评论由一些简短的文本和一个可选的照片组成,照片是会议时拍摄的。我想以上这些就是初始开发时的所有需求了。

这个 项目 会包含若干个 应用程序。一个采用 HTML 前端的传统网页 应用、一个 API 应用和一个用于手机端的单页应用。听起来如何?

学习就是实践

对于技能的掌握只有通过实践才能达成,没有其它可多说的。当你阅读一本关于 Symfony 的书时,再用个人电脑开发一个应用就更好了。本书的特别之处就在于一切都已就绪,让你可以跟着书的步骤来编码,并且得到的结果和我在自己电脑上开发时得到的一样。

本书包含您需要编写的所有代码以及为获得最终结果而需要执行的所有命令。没有任何代码和命令在书中缺失。这成为可能,要归功于现代 Symfony 应用几乎没有样本代码。我们要一起写的大部分代码都是项目的 业务逻辑 。其它的基本都是自动化的,或者是为我们自动生成的代码。

查看最终架构图

即便这个项目的想法很简单,我们也不会只开发一个类似 “Hello World” 的入门项目。我们不会仅仅使用 PHP 和数据库。

我们的目标是创建一个有一定复杂度的项目,这种复杂度在真实开发中才会遇到。想要一个证据?看一下这个项目的最终架构图。

../_images/infrastructure.svg

开发这样的一个项目,只要写很少量的代码,这是使用一个框架的好处之一。

  • 网站的 src/ 目录下有 20 个 PHP 类。
  • 根据 PHPLOC 的报告,PHP 的逻辑代码行(LLOC)有 550 行;
  • 分布在 3 个文件中的 40 行配置微调(以注解和 YAML 的格式),主要是用来配置后台的设计。
  • 20 行的开发环境软件配置(Docker);
  • 100 行的生产环境软件配置(SymfonyCloud);
  • 5 个显式的环境变量。

准备好来面对挑战了吗?

获取项目的源代码

为了延续这个项目主题体现的老派风格,我本可以随书附一张 CD 来包含源代码,对吧?但用一个 Git 仓库来代替 CD,怎么样?

在你本地电脑上找个地方克隆这个代码仓库 guestbook repository

  1. $ symfony new --version=5.2-1 --book guestbook

该仓库包含了本书的所有代码。

请注意,我们不用 git clone,而是用 symfony new,因为它所做的不仅仅是从代码仓库复制代码(代码仓库在 GitHub 的 the-fast-track 机构名下:https://github.com/the-fast-track/book-5.2-1)。该命令还启动 web 服务器和容器,更新数据库结构,载入固定的伪数据……执行完该命令后,网站就运行了,可以被访问。

这里的代码100%保证和书中的保持一致(使用上述的代码仓库 URL)。尝试让书中的更新和仓库里的代码手工保持一致,这几乎是不可能的。我在过去试过,但失败了,这就是不可行的,尤其是对于我写的这种关于开发网站的书。由于每一章节都依赖前面的章节,一个改动可能会对后续章节带来影响。

好消息是:本书的代码仓库是从本书内容 自动生成 的。你没看错。我喜欢自动化所有的东西,所以我写了个脚本,它会读取书的内容并且生成一个 Git 代码仓库。这还有个良性的副作用:当更新本书内容时,如果更新的内容不一致或是我忘了更新一些指令,这个脚本就会执行失败。这就是 BDD, Book Driven Development

浏览源代码

更棒的是,这个仓库并不只是 master 分支上的最终版本。这个脚本会执行书中解释的每个操作,并且把每一节结束时的代码状态提交到仓库。它还会给每一个步骤和子步骤打标签(git tags),以便于浏览代码。很棒,不是吗?

如果你想偷懒的话,你用正确的标签就可以得到每一个步骤结尾的代码。比如,如果你想要读取并测试步骤 10 结尾处的代码,就执行下面的命令:

  1. $ symfony book:checkout 10

就和复制代码仓库一样,我们签出代码不用 git checkout,而是用 symfony book:checkout。这个命令确保了不管你本地代码的状态如何,你总是得到一个可运行的网站,并且和你要求的步骤对应。 我要警告你,这个操作会删除所有的数据,代码和容器。

你也能签出任何子步骤的代码:

  1. $ symfony book:checkout 10.2

再说一次,我强烈推荐你自己敲一遍代码。但如果你在哪里被卡住了,你总是可以把你的代码和书中的代码进行比对。

你不确定在子步骤 10.2 里把所有事情都弄对了吗?去看一下代码比对:

  1. $ git diff step-10-1...step-10-2
  2. # And for the very first substep of a step:
  3. $ git diff step-9...step-10-1

你想要知道一个文件是何时创建或改动的?

  1. $ git log -- src/Controller/ConferenceController.php

你也能在直接在 GitHub 上浏览代码比对,标签和提交。如果你在读一本纸质书的话,这也是一个很好的复制/粘贴代码的方式。


This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.