Обновление существующих приложений до Symfony Flex

Дата обновления перевода 2022-02-01

Обновление существующих приложений до Symfony Flex

Использование Symfony Flex необязательно, даже в Symfony 4, где 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, которая больше не доступна в Symfony 4. Для начала, удалите эту зависимость:

    1
    $ composer remove symfony/symfony

    Теперь, добавьте пакет symfony/symfony к разделку conflict файла проекта composer.json, как показано в этом примере проекта skeleton-project, чтобы он не был установлен снова:

    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-pack 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 config не использует суффиксы в файлах конфигурации, поэтому старый app/config/config_dev.yml станет config/packages/dev/*.yaml, и т.д.
  5. Самый важный файл конфигурации - app/config/services.yml, который теперь находится тут: config/services.yaml. Скопируйте содержание файла services.yaml по умолчанию, а затем добавьте собственную конфигурацию сервиса. Позже вы сможете вернуться к этому файлу, так как блогдаря функции автомонтирования Symfony, вы можете удалить большинство конфигурации сервиса.

    Note

    Убедитесь, что ваши предыдущие файлы конфигурации не имеют заявлений imports, указывающих на источники, уже загруженные методами Kernel::configureContainer() или Kernel::configureRoutes().

  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/*, кроме файлов, относящихся к пакетам (вроде AppBundle.php и DependencyInjection/), в src/, и обновите пространство имен для каждого перемещенного файла, чтобы он был App\... (продвинутые IDE могут делать это автоматически).

    В дополнение к перемещению файлов, обновите значения autoload и autoload-dev файла composer.json как показано в этом примере, чтобы использовать App\ и App\Tests\ в качестве пространств имен приложения.

    Если вы использовали множество пакетов для организации своего кода, вы должны реорганизовать ваш код в src/. Например, если у вас были src/UserBundle/Controller/DefaultController.php и src/ProductBundle/Controller/DefaultController.php, вы можете переместить их в src/Controller/UserController.php и src/Controller/ProductController.php.

  8. Переместите публичные ресурсы, такие как изображения, или скомпилированные файлы CSS/JS, из src/AppBundle/Resources/public/ в public/ (например, public/images/).
  9. Удалите src/AppBundle/.
  10. Переместите источник ресурсов (например, файлы SCSS) в assets/, и используйте Webpack Encore, чтобы управлять ими и компилировать их.
  11. Переменные окружения SYMFONY_DEBUG и SYMFONY_ENV были заменены переменными APP_DEBUG и APP_ENV. Скопируйте их значения в новые переменные, а затем удалите предыдущие.
  12. Создайте новый фронт-контроллер public/index.php, скопировав источник Symfony index.php, и, если вы настраивали ваши файлы web/app.php и web/app_dev.php, скопируйте эти изменения в новый файл. Теперь вы можете удалить старый каталог web/.
  13. Обновите скрипт bin/console, скопировав источник Symfony bin/console, и изменив все в соответствии с вашим изначальным скриптом консоли.
  14. Удалите скрипт bin/symfony_requirements, и если вам нужна замена для него, используйте новый проверщик требований Symfony.
  15. Обновите файл .gitignore, чтобы заменить существующую запись var/logs/ на var/log/, что является новым именем для каталога логов.

Настройка путей Flex

Рецепты Flex делают несколько предположений о структуре каталогов вашего проекта. Некоторые из этих предположений можно настроить, добавив ключ в разделе extra вашего файла composer.json. Например, чтобы указать 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/

Если вы настроите эти пути, некоторые файлы, скопированные из рецепта, все еще могут содержать ссылки на оригинальный путь. Другими словами: вам может понадобиться обновить некоторые вещи вручную, после установки рецепта.