Я работаю над переносом существующего проекта Symfony 2.8 на Symfony 3.4. Способы импорта пакетных сервисов различаются в этих версиях Symfony, и мне интересно, каковы плюсы и минусы различных подходов.
Существующий проект был построен с использованием разных пакетов, каждый из которых имеет свой собственный файл XYBundle\Resources\services.yml, а файл XYBundle\DependencyInjection\XYExtension.php используется для добавления конфигурации службы в контейнер:
class XYExtension extends Extension {
public function load(array $configs, ContainerBuilder $container) {
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
}
}
Таким образом, сервисы, определенные в XYBundle\Resources\services.yml, становятся доступными в рамках проекта.
При создании нового пакета в Symfony 3.4 расширение не создается. Вместо services.yml добавлен в приложения config.yml
// app/config/config.yml
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
- { resource: "@XYBundle/Resources/config/services.yml" }
Однако AppBundle, который был создан со скелетом Symfony 3.4, вообще не имеет файла services.yml. Вместо этого все классы в этом пакете автоматически становятся доступными как служба с использованием автопровод и автоконфигурация в файле app/config/services.yml.
Я знаю, что автопровод был добавлен в Symfony 3.3 и что это отличный способ автоматически добавлять службы и добавлять к ним параметры. Очевидно, что при использовании autowire файл XYBundle\Resources\services.yml больше не нужен.
Однако есть ли разница в использовании "старого" способа расширения для добавления / импорта файла пакета services.yml и нового способа его импорта в app/config/config.yml?
И хотя это немного не по теме, вы можете создать новый проект 3.4 с помощью установщика Flex и наблюдать за новой структурой каталогов. Каталог приложения исчезнет. Использование новой структуры упростит переход на S4 когда-нибудь в будущем.






Принципиально нет разницы между двумя подходами. Если вы посмотрите на FrameworkBundle, то он по-прежнему использует расширение для загрузки сервисов даже в 4.x. Если ваш новый пакет предназначен для совместного использования несколькими приложениями, используйте расширение, чтобы избежать необходимости для каждого приложения явно импортировать его. Если пакет предназначен строго для одного приложения, то использование операторов импорта избавляет вас от необходимости создавать расширение.