升级现有应用到 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
依赖项是不够的。您还必须将目录结构升级到上面显示的结构。没有自动工具来进行此升级,因此您必须按照以下手动步骤操作
安装 Flex 作为您项目的依赖
1
$ composer require symfony/flex
如果项目的
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
如果项目的
composer.json
文件不包含symfony/symfony
依赖项,则它已经显式定义了其依赖项,这是 Flex 所要求的。重新安装所有依赖项,以强制 Flex 在config/
中生成配置文件,这是升级过程中最繁琐的部分1 2
$ rm -rf vendor/* $ composer install
- 无论您遵循了之前的哪个步骤,此时您都将在
config/
中拥有许多新的配置文件。它们包含 Symfony 定义的默认配置,因此您必须检查app/config/
中的原始文件,并在新文件中进行必要的更改。Flex 配置不在配置文件中使用后缀,因此旧的app/config/config_dev.yml
转到config/packages/dev/*.yaml
等。 最重要的配置文件是
app/config/services.yml
,现在位于config/services.yaml
。复制默认 services.yaml 文件的内容,然后添加您自己的服务配置。稍后您可以重新访问此文件,因为感谢 Symfony 的自动装配功能,您可以删除大部分服务配置。注意
确保您之前的配置文件没有指向
Kernel::configureContainer()
或Kernel::configureRoutes()
方法已加载的资源的imports
声明。按如下方式移动其余的
app/
内容(之后,删除app/
目录)app/Resources/views/
->templates/
app/Resources/translations/
->translations/
app/Resources/<BundleName>/views/
->templates/bundles/<BundleName>/
- 其余
app/Resources/
文件 ->src/Resources/
将原始 PHP 源代码文件从
src/AppBundle/*
移动,除了 bundle 特定的文件(如AppBundle.php
和DependencyInjection/
),移动到src/
并更新每个移动文件的命名空间为App\...
(高级 IDE 可以自动执行此操作)。除了移动文件外,还要更新
composer.json
文件的autoload
和autoload-dev
值,如此示例所示,以使用App\
和App\Tests\
作为应用程序命名空间。如果您使用多个 bundle 来组织您的代码,您必须将您的代码重组到
src/
中。例如,如果您有src/UserBundle/Controller/DefaultController.php
和src/ProductBundle/Controller/DefaultController.php
,您可以将它们移动到src/Controller/UserController.php
和src/Controller/ProductController.php
。- 将公共资源,如图像或编译后的 CSS/JS 文件,从
src/AppBundle/Resources/public/
移动到public/
(例如public/images/
)。 - 删除
src/AppBundle/
。 - 将资源源文件(例如 SCSS 文件)移动到
assets/
并使用 Webpack Encore 来管理和编译它们。 SYMFONY_DEBUG
和SYMFONY_ENV
环境变量已替换为APP_DEBUG
和APP_ENV
。将它们的值复制到新变量,然后删除旧变量。- 创建新的
public/index.php
前端控制器,复制 Symfony 的 index.php 源代码,如果您在web/app.php
和web/app_dev.php
文件中进行了任何自定义,请将这些更改复制到新文件中。您现在可以删除旧的web/
目录。 - 更新
bin/console
脚本,复制 Symfony 的 bin/console 源代码,并根据您的原始控制台脚本更改任何内容。 - 删除
bin/symfony_requirements
脚本,如果您需要它的替代品,请使用新的 Symfony Requirements Checker。 - 更新
.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 后,您可能需要手动更新一些内容。