#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.
Однако пользовательские пакеты внутри приложения все еще поддерживаются, и бывают случаи, когда они оказываются полезными.