跳到内容

升级现有应用到 Symfony Flex

编辑此页

即使在默认使用 Flex 的 Symfony 4 中,使用 Symfony Flex 也是可选的。然而,Flex 非常方便,并能极大地提高您的生产力,因此强烈建议将您现有的应用程序升级到它。

Symfony Flex 建议应用程序使用以下目录结构,这与 Symfony 4 中的默认结构相同,但您可以自定义一些目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
your-project/
├── assets/
├── bin/
│   └── console
├── config/
│   ├── bundles.php
│   ├── packages/
│   ├── routes.yaml
│   └── services.yaml
├── public/
│   └── index.php
├── src/
│   ├── ...
│   └── Kernel.php
├── templates/
├── tests/
├── translations/
├── var/
└── vendor/

这意味着在您的应用程序中安装 symfony/flex 依赖项是不够的。您还必须将目录结构升级到上面显示的结构。没有自动工具来进行此升级,因此您必须按照以下手动步骤操作

  1. 安装 Flex 作为您项目的依赖

    1
    $ composer require symfony/flex
  2. 如果项目的 composer.json 文件包含 symfony/symfony 依赖项,它仍然依赖于 Symfony Standard Edition,这在 Symfony 4 中不再可用。首先,删除此依赖项

    1
    $ composer remove symfony/symfony

    现在将 symfony/symfony 包添加到项目 composer.json 文件的 conflict 部分,如此骨架项目的示例所示,以便它不会再次安装

    1
    2
    3
    4
    5
    6
    7
    8
    {
          "require": {
              "symfony/flex": "^1.0",
    +   },
    +   "conflict": {
    +       "symfony/symfony": "*"
          }
      }

    现在您必须在 composer.json 中添加您的项目所需的所有 Symfony 依赖项。一种快速的方法是添加先前 symfony/symfony 依赖项中包含的所有组件,稍后您可以删除任何您不需要的组件

    1
    2
    3
    $ composer require annotations asset orm twig \
      logger mailer form security translation validator
    $ composer require --dev dotenv maker-bundle orm-fixtures profiler
  3. 如果项目的 composer.json 文件不包含 symfony/symfony 依赖项,则它已经显式定义了其依赖项,这是 Flex 所要求的。重新安装所有依赖项,以强制 Flex 在 config/ 中生成配置文件,这是升级过程中最繁琐的部分

    1
    2
    $ rm -rf vendor/*
    $ composer install
  4. 无论您遵循了之前的哪个步骤,此时您都将在 config/ 中拥有许多新的配置文件。它们包含 Symfony 定义的默认配置,因此您必须检查 app/config/ 中的原始文件,并在新文件中进行必要的更改。Flex 配置不在配置文件中使用后缀,因此旧的 app/config/config_dev.yml 转到 config/packages/dev/*.yaml 等。
  5. 最重要的配置文件是 app/config/services.yml,现在位于 config/services.yaml。复制默认 services.yaml 文件的内容,然后添加您自己的服务配置。稍后您可以重新访问此文件,因为感谢 Symfony 的自动装配功能,您可以删除大部分服务配置。

    注意

    确保您之前的配置文件没有指向 Kernel::configureContainer()Kernel::configureRoutes() 方法已加载的资源的 imports 声明。

  6. 按如下方式移动其余的 app/ 内容(之后,删除 app/ 目录)

    • app/Resources/views/ -> templates/
    • app/Resources/translations/ -> translations/
    • app/Resources/<BundleName>/views/ -> templates/bundles/<BundleName>/
    • 其余 app/Resources/ 文件 -> src/Resources/
  7. 将原始 PHP 源代码文件从 src/AppBundle/* 移动,除了 bundle 特定的文件(如 AppBundle.phpDependencyInjection/),移动到 src/ 并更新每个移动文件的命名空间为 App\... (高级 IDE 可以自动执行此操作)。

    除了移动文件外,还要更新 composer.json 文件的 autoloadautoload-dev 值,如此示例所示,以使用 App\App\Tests\ 作为应用程序命名空间。

    如果您使用多个 bundle 来组织您的代码,您必须将您的代码重组到 src/ 中。例如,如果您有 src/UserBundle/Controller/DefaultController.phpsrc/ProductBundle/Controller/DefaultController.php,您可以将它们移动到 src/Controller/UserController.phpsrc/Controller/ProductController.php

  8. 将公共资源,如图像或编译后的 CSS/JS 文件,从 src/AppBundle/Resources/public/ 移动到 public/ (例如 public/images/)。
  9. 删除 src/AppBundle/
  10. 将资源源文件(例如 SCSS 文件)移动到 assets/ 并使用 Webpack Encore 来管理和编译它们。
  11. SYMFONY_DEBUGSYMFONY_ENV 环境变量已替换为 APP_DEBUGAPP_ENV。将它们的值复制到新变量,然后删除旧变量。
  12. 创建新的 public/index.php 前端控制器,复制 Symfony 的 index.php 源代码,如果您在 web/app.phpweb/app_dev.php 文件中进行了任何自定义,请将这些更改复制到新文件中。您现在可以删除旧的 web/ 目录。
  13. 更新 bin/console 脚本,复制 Symfony 的 bin/console 源代码,并根据您的原始控制台脚本更改任何内容。
  14. 删除 bin/symfony_requirements 脚本,如果您需要它的替代品,请使用新的 Symfony Requirements Checker
  15. 更新 .gitignore 文件,将现有的 var/logs/ 条目替换为 var/log/,这是日志目录的新名称。

自定义 Flex 路径

Flex recipes 对您项目的目录结构做了一些假设。可以通过在您的 composer.json 文件的 extra 部分下添加一个键来自定义其中一些假设。例如,告诉 Flex 将任何 PHP 类复制到 src/App 而不是 src

1
2
3
4
5
6
7
{
    "...": "...",

    "extra": {
        "src-dir": "src/App"
    }
}

可配置的路径是

  • bin-dir: 默认为 bin/
  • config-dir: 默认为 config/
  • src-dir 默认为 src/
  • var-dir 默认为 var/
  • public-dir 默认为 public/

如果您自定义这些路径,从 recipe 复制的一些文件可能仍然包含对原始路径的引用。换句话说:在安装 recipe 后,您可能需要手动更新一些内容。

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