Чтобы автоматически обнаружить Расширение DI, я попытался следовать документация, за исключением того, что в моем проекте я не добавляю в свои папки префикса Bundle, и я думаю, что мне нужно зарегистрировать расширение вручную.
Это моя древовидная структура папок, в которой я только что создал этот AppContextExtension.
portal/src/Common
└── Infrastructure
└── Symfony
├── Controller
└── DependencyInjection
└── AppContextExtension
namespace Portal\Common\Infrastructure\Symfony\DependencyInjection;
use Symfony\Component\HttpKernel\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Routing\Loader\YamlFileLoader;
class AppContextExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
dump('it work');die;
}
}
Итак, есть идеи, как зарегистрировать это расширение в контейнере, чтобы сделать dump живым ?? И почему Расширение не авторегистрация !!!
Хм. Какую версию Symfony вы используете? Если у вас все еще есть приложение / AppKernel, вам в значительной степени нужно создать пакет. В более новых версиях для начала есть файл src / Kernel.php. Вы все еще можете сохранить существующий макет. Просто нужно явно указать класс расширения в вашем файле класса пакета.
Большое спасибо, решение сработало для меня :) Я очень ценю вашу помощь, человек.
Кстати, вы можете опубликовать решение, я приму его и проголосую за него. Это то, чего я не могу понять, обычно мой AppContextExtension регистрируется автоматически, потому что у меня есть в моих services.yml autoconfigure: true и autowire : true, что означает, что весь мой класс зарегистрирован как services ... почему в моем случае класс AppContext не регистрируется автоматически !!
Существует большая разница между определением службы в контейнере и ее вызовом в нужный момент в процессе загрузки.
Можно ли зарегистрировать расширение через service.yml?
Неа. Класс расширения - это то, что загружает различные службы и файлы конфигурации. Вид уловки-22. И, честно говоря, я думаю, вам было бы лучше просто добавить класс пакета к тому, что на самом деле является пакетом, и назвать его днем.
Когда мы работаем с последней версией Symfony, мы предпочитаем не использовать префикс Bundle, особенно когда структура основана на шаблоне проектирования DDD, поэтому добавление папки пакета не может быть хорошо для когерентности
Как упоминалось во втором комментарии, нет необходимости изменять какое-либо пространство имен или структуру каталогов. Наличие Bundle в пространстве имен всегда было просто условием, а не требованием. Добавление простого файла пакета - действительно «правильный» способ сделать что-то. Имейте в виду, что в последних рекомендациях Symfony предлагается не иметь AppBundle. Не удаляя все связки вместе. Сказав это, это, конечно же, ваше приложение и ваш выбор. Просто хочу убедиться, что вы понимаете различия двух обсуждаемых подходов.
Можете ли вы опубликовать решение с правильными пространствами имен !!




Фактически решение состоит во внедрении класса Extension внутрь AppKernel, поскольку расширения можно загружать с помощью Kernel::build().
//AppKernel.php
class AppKernel extends Kernel
{
//
protected function build(ContainerBuilder $container)
{
$container->registerExtension(new \Portal\Common\Infrastructure\Symfony\DependencyInjection\AppExtension());
}
Спасибо за @Cerad, как помог мне найти свой путь.
Я думаю, мы как бы заблудились здесь, в ла-ла-ленд, но, возможно, это тот пример, о котором вы просили.
# portal/src/Symfony
# could have been portal/src/Portal/Common/Infrastructure/Symfony
# but I got lazy
namespace Portal\Common\Infrastructure\Symfony;
use Portal\Common\Infrastructure\Symfony\DependencyInjection\AppContextExtension;
use Symfony\Component\HttpKernel\Bundle\Bundle;
# I suppose SymfonyBundle might be a better name
class PortalBundle extends Bundle
{
public function getContainerExtension()
{
return new AppContextExtension();
}
}
Расширение
namespace Portal\Common\Infrastructure\Symfony\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
class AppContextExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
dump('it work');die;
}
}
конфигурация / bundles.php
Portal\Common\Infrastructure\Symfony\PortalBundle::class => ['all' => true],
composer.json
"autoload": {
"psr-4": {
"App\\": "src/",
"Portal\\Common\\Infrastructure\\Symfony\\": "portal/src/Symfony/"
}
},
Все работает так, как ожидалось, но ваши комментарии об autowire заставляют меня подозревать, что вы пытаетесь сделать что-то совсем другое. Autowire обычно предназначен для служб, определяемых приложением. Вы не станете автоматически подключать связку.
Наслаждаться
не могли бы вы объяснить мне, пожалуйста, эти 2 строки «Приложение \\»: «src /», «Портал \\ Common \\ Infrastructure \\ Symfony \\»: «portal / src / Symfony /»