Расширение регистрации зависимостей (DI) - PullRequest
0 голосов
/ 31 мая 2018

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

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

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

# 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;
    }
}

config / 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, как правило, для приложений, определенных услуг.Вы не будете автоматически связывать пакет.

Наслаждайтесь

0 голосов
/ 31 мая 2018

На самом деле решение состоит в том, чтобы внедрить класс 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, как помог мне найти свой путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...