Регистр расширения внедрения зависимостей (DI)

Чтобы автоматически обнаружить Расширение 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 живым ?? И почему Расширение не авторегистрация !!!

stackoverflow.com/questions/49780704/…
Cerad 31.05.2018 14:00

Хм. Какую версию Symfony вы используете? Если у вас все еще есть приложение / AppKernel, вам в значительной степени нужно создать пакет. В более новых версиях для начала есть файл src / Kernel.php. Вы все еще можете сохранить существующий макет. Просто нужно явно указать класс расширения в вашем файле класса пакета.

Cerad 31.05.2018 14:09

Большое спасибо, решение сработало для меня :) Я очень ценю вашу помощь, человек.

famas23 31.05.2018 14:18

Кстати, вы можете опубликовать решение, я приму его и проголосую за него. Это то, чего я не могу понять, обычно мой AppContextExtension регистрируется автоматически, потому что у меня есть в моих services.yml autoconfigure: true и autowire : true, что означает, что весь мой класс зарегистрирован как services ... почему в моем случае класс AppContext не регистрируется автоматически !!

famas23 31.05.2018 23:35

Существует большая разница между определением службы в контейнере и ее вызовом в нужный момент в процессе загрузки.

Cerad 31.05.2018 23:47

Можно ли зарегистрировать расширение через service.yml?

famas23 01.06.2018 09:33

Неа. Класс расширения - это то, что загружает различные службы и файлы конфигурации. Вид уловки-22. И, честно говоря, я думаю, вам было бы лучше просто добавить класс пакета к тому, что на самом деле является пакетом, и назвать его днем.

Cerad 01.06.2018 14:05

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

famas23 01.06.2018 14:49

Как упоминалось во втором комментарии, нет необходимости изменять какое-либо пространство имен или структуру каталогов. Наличие Bundle в пространстве имен всегда было просто условием, а не требованием. Добавление простого файла пакета - действительно «правильный» способ сделать что-то. Имейте в виду, что в последних рекомендациях Symfony предлагается не иметь AppBundle. Не удаляя все связки вместе. Сказав это, это, конечно же, ваше приложение и ваш выбор. Просто хочу убедиться, что вы понимаете различия двух обсуждаемых подходов.

Cerad 01.06.2018 15:00

Можете ли вы опубликовать решение с правильными пространствами имен !!

famas23 01.06.2018 18:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
10
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Фактически решение состоит во внедрении класса 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 /»

famas23 03.06.2018 00:25

Другие вопросы по теме