步骤 3: 从零开始直到投入生产环境

    花点时间去试着找一张你满意的老式“在建设中” GIF 动图。我要用的是 这张

    我告诉过你了,这会非常有趣的。

    我们之前已经一起安装了 命令行工具,现在用它来创建一个新的 Symfony 项目。

    这个命令对 Composer 做了一层简单的封装,用来方便地创建 Symfony 项目。它使用一个包含了最少依赖的 ,这些依赖是几乎所有项目都要用到的 Symfony 组件:一个控制台工具和创建 web 应用必需的 HTTP 抽象。

    如果你去看一下这个项目骨架在 GitHub 上的代码仓库,你会注意到它只有一个 composer.json 文件,几乎是空的。但是 guestbook 目录下有好多文件了,这是怎么做到的?答案就在 symfony/flex 这个包里。Symfony Flex 是一个 Composer 插件,它可以介入到包的安装过程中。当它检测到新装的包对应有一个 recipe,这个插件就会执行它。

    Symfony Recipe 的主入口是一个 manifest 文件,它描述了在 Symfony 应用中自动注册一个包时所进行的操作。你在 Symfony 应用下安装一个包的时候,永远不需要去阅读包的 README 文件。自动化是 Symfony 的重要特点。

    因为 Git 已经在你的电脑上安装过了,所以 symfony new 也会为我们创建一个 Git 仓库,并且会进行首次代码提交。

    看一下目录结构:

    1. ├── bin/
    2. ├── composer.json
    3. ├── composer.lock
    4. ├── config/
    5. ├── src/
    6. ├── symfony.lock
    7. ├── var/
    8. └── vendor/

    bin/ 目录包含了主要的命令行入口:console 程序。你会一直用到它。

    目录由一套配置文件组成,它们提供了合理的缺省值。每个包对应一个配置文件。你很少会改动它们,信赖缺省值几乎总是个好主意。

    public/ 目录是 web 根目录,下面的 index.php 脚本是所有 HTTP 动态资源的主入口。

    src/ 目录存放你将要写的代码;你大部分时间都会花在里面。默认情况下,该目录下所有类都是用 App 作为命名空间。这里是你的主目录、你的代码、你的业务逻辑。Symfony 把这个目录下的主动权留给你。

    var/ 目录包含了缓存,日志和其它应用程序运行时产生的文件。你可以不用管它。它是生产环境下唯一一个需要写权限的目录。

    vendor/ 目录包含了所有由 Composer 安装的包,包括 Symfony 本身。这个目录是提高生产率的秘密武器。我们不要重新发明轮子,而是要依赖已有的程序库来完成那些困难的工作。这个目录由 Composer 管理,永远不要去动它。

    创建一些公开可访问资源

    public/ 目录下的任何文件都是可以通过浏览器直接访问的。比如说,如果你把你的 GIF 动图文件(把它命名为 under-construction.gif)移动到新建的 public/images/ 目录下,它就可以通过诸如 https://localhost/images/under-construction.gif 这样的 URL 来访问。

    在这里下载我的 GIF 图:

    1. $ mkdir public/images/
    2. $ php -r "copy('http://clipartmag.com/images/website-under-construction-image-6.gif', 'public/images/under-construction.gif');"

    symfony 命令自带了一个为开发工作优化过的 web 服务器。如果我和你说它和 Symfony 搭配得很好,你不会惊讶的。但注意,不要在生产环境中使用这个 web 服务器。

    在项目目录下,以后台运行的方式启动 web 服务器(用 -d 选项):

    1. $ symfony server:start -d

    web 服务器启动了,它会使用从 8000 端口开始的第一个可用端口。你可以执行如下命令作为快捷方式,从而在浏览器里打开网站:

    你的默认浏览器应该会获得焦点,并且新开一个标签页,展示出和下图类似的内容:

    步骤 3: 从零开始直到投入生产环境 - 图2

    小技巧

    运行 symfony server:log 来排查问题,它会把来自 web 服务器,PHP 和应用程序的最新日志显示出来。

    浏览到 。看上去像是这样吗?

    满意了吧?让我们来提交我们的代码。

    1. $ git add public/images
    2. $ git commit -m'Add the under construction image'

    添加一个 favicon

    浏览器会请求 favicon,缺失它的话,日志里会产生大量的 404 HTTP 错误消息。为了避免这种情况,让我们现在来加一个 favicon:

    1. $ php -r "copy('https://symfony.com/favicon.ico', 'public/favicon.ico');"
    2. $ git commit -m'Add a favicon'

    把我们的工作发布到生产环境中,你觉得如何?我知道,我们甚至还没有一个正式的 HTML 页面来欢迎我们的用户。但哪怕是在生产服务器上看到那个”在建设中“的图片,也是向前迈进的伟大一步。你知道这句格言:尽早部署,经常部署

    你可以把你的应用放在任何支持 PHP 的主机供应商那里……这意味着市面上几乎所有的主机供应商。但还是要做几点检查:我们想要最新的 PHP 版本,而且需要有数据库、消息队列和其它更多的服务。

    symfony 命令内置对 SymfonyCloud 的支持。让我们来初始化一个 SymfonyCloud 项目:

    1. $ symfony project:init

    这个命令会生成几个 SymfonyCloud 所需的新文件:.symfony/services.yaml.symfony/routes.yaml.symfony.cloud.yaml

    把它们纳入 Git 的管理,并且提交:

    注解

    git add . 命令意味着包含所有文件,所以执行它会有点危险,但在这里使用没有问题,因为一个 .gitignore 文件已经生成,它会自动排除所有我们不想要提交的文件。

    进入生产环境

    部署的时刻?

    新建一个 SymfonyCloud 项目:

    1. $ symfony project:create --title="Guestbook" --plan=development

    这个命令会做很多工作:

    • 你第一次执行这个命令的时候,如果还没有用你的 SymfonyConnect 凭证来认证过身份的话,请做一下。
    • 它会在 SymfonyCloud 上创建一个新项目(对于每个新的开发项目,你都有 7 天的 免费 使用期)。

    然后就部署:

    1. $ symfony deploy

    把代码推送到 Git 代码仓库后,它就会部署好。在该命令执行后,这个项目就会有一个特定的域名,可以用来访问这个项目。

    检查一下,看一切是否顺利运行:

    1. $ symfony open:remote

    你应该会看到一个 404 错误页面,但浏览 /images/under-construction.gif 的话,你应该会看到我们的图片。

    请注意你在 SymfonyCloud 上不会看到那个漂亮的 Symfony 默认页面。为什么呢?你一会就会知道 Symfony 支持若干环境变量,而 SymfonyCloud 把代码自动部署在了生产环境下。

    小技巧

    如果你要在 SymfonyCloud 上删除项目,就用 命令。