Symfony — Создание собственной конфигурации (service.yaml) внутри пакета

#php #symfony #yaml #bundle #symfony4

#php #symfony #yaml #пакет #symfony4

Вопрос:

Я пытаюсь что-то так много времени, но, возможно, это даже невозможно. Извините за мой плохой язык. Итак, я следил за документом Symfony https://symfony.com/doc/current/bundles.html чтобы создать новый пакет, и чем я последовал https://symfony.com/doc/current/bundles/extension.html для создания расширения DI.

Мои файлы: AcmeHelloExtension.php

 namespace AppAcmeHelloBundleDependencyInjection;

use SymfonyComponentConfigFileLocator;
use SymfonyComponentDependencyInjectionLoaderXmlFileLoader;
use SymfonyComponentDependencyInjectionExtensionExtension;
use SymfonyComponentDependencyInjectionContainerBuilder;

class AcmeHelloExtension extends Extension
{

    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new XmlFileLoader(
            $container,
            new FileLocator(__DIR__.'/../Resources/config')
        );
        $loader->load('services.xml');
    }
}
  

AcmeHelloBundle.php

 
namespace AppAcmeHelloBundle;

use SymfonyComponentHttpKernelBundleBundle;

class AcmeHelloBundle extends Bundle
{

}

  

Я добавил ее в config/bundles.php

src/Acme /HelloBundle/Resources/config/services.yaml

 services:
    AppAcmeHelloBundleAcmeHelloBundle:
        tags: ['example-tags']
  

Этот файл сервиса не загружается автоматически, нужно ли мне выполнять следующие шаги или он должен работать? Когда я проверяю это с помощью debug:container ….bundle…
Опция-Теги имеет пустое значение. Когда я помещаю этот код в config / services.yaml это работает.

Комментарии:

1. Почему вы пытаетесь сделать класс пакета сервисом? Кроме того, опубликованный вами код пытается загрузить services.xml но в вашем вопросе вы ссылаетесь на это как services.yaml. Опечатка? В любом случае вставьте оператор die в Extension::load и подтвердите, что он вызывается.

2. Что вы имеете в виду, почему? Я хочу настроить сервисы внутри моего пакета. О боже, не имеет значения XML-файл или yaml-локатор… оператор die не вызывается.

3. Вы на самом деле назвали свой пакет AcmeHello? Я спрашиваю, потому что пакет и префикс расширения должны быть одинаковыми, чтобы вызывалось расширение. Итак, если вы использовали что-то другое, то проверьте, совпадают ли они. Может быть, опубликовать строку из config/bundles.php таким образом, мы можем проверить часть среды. Что касается записи службы AcmeHelloBundle, возможно, вы добавили ее в качестве примера, но нет необходимости определять для нее сервис. Другие классы да, классы пакетов нет.

4. Если у вас все еще возникают проблемы, создайте новый проект, добавьте простой пакет и опубликуйте на github. Есть несколько частей, которые необходимо правильно настроить, чтобы все заработало. Будет легко найти проблему на полном примере. Возможно, вы даже сами обнаружите проблему в процессе.

5. @Cerad AppAcmeHelloBundleAcmeHelloBundle::class => ['all' => true] Теперь он загружает служебный файл, я попробовал это с помощью инструкции die. Но он не хочет изменять конфигурацию моего сервиса. Хорошо, я создам новый проект и опубликую ссылку на github здесь. Всего несколько минут…

Ответ №1:

Основная проблема заключалась в том, что исходный код пакета был расположен в каталоге src проекта:

 project
    src
        Ztest
            ZtestBundle.php
  

Это, в свою очередь, приводило к тому, что службы пакета автоматически подключались конфигурацией / службами приложения.файл yaml:

 # projectconfigservices
    App:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            ...
            - '../src/Ztest' # Add this to fix the problem
  

Исключение исходного кода пакета исправило проблемы. Автоматическое подключение на уровне приложения переопределяет любое ручное подключение, выполняемое на уровне пакета.

Конечно, в целом, если вы решите, что вам нужен пакет, тогда его исходный код должен находиться в его собственном независимом каталоге:

 project
    src
    src-ztest-bundle
  

Для этого вам также необходимо обновить раздел psr-4 composer.json и запустить «composer dump-автозагрузка».

Имейте в виду, что в Symfony 4 пользовательские пакеты рекомендуется использовать только для кода, совместно используемого несколькими приложениями Symfony. В этом случае пакет должен в конечном итоге оказаться в собственном репозитории и пакете composer.

Однако пользовательские пакеты внутри приложения все еще поддерживаются, и бывают случаи, когда они оказываются полезными.