【问题标题】:How to get instance of PHP-DI container from any class I want?如何从我想要的任何类中获取 PHP-DI 容器的实例?
【发布时间】:2019-01-14 07:25:06
【问题描述】:

我在我的 PHP 项目中使用 PHP-DI 6 容器。在我的程序开始时,我只是初始化了容器并获得了 Application 类并注入了所有依赖项。

    $container   = new Container();
    $application = $container->get(Application::class);

    $application->initialize();
    $application->run();

在下图中,您可以看到我在项目中使用的类。

Asterisk Dispatcher 被注入到 Application 类中。

private $asteriskDispatcher;

public function __construct(AsteriskDispatcher $asteriskDispatcher)
{
    $this->asteriskDispatcher = $asteriskDispatcher;
}

然后,在 AsteriskDispatcher 类中,我需要创建一个 Asterisk Manager 实例列表,它还将在不久的将来包含一些依赖项。

我不想通过所有类继承容器。有没有办法将 PHP-DI 容器初始化为单例,所以我可以随时使用它来创建一些对象?

这就是我现在的做法,我只是在我的 AsteriskDispatcher 类中创建了一个新的 PHP-DI 容器实例,这看起来太糟糕了。

class AsteriskDispatcher implements AsteriskDispatcherInterface
{
    private $listOfAsteriskManagers;

    public function __construct()
    {
        $configurations = AsteriskConnectionsConfiguration::$connectionsConfiguration;

        $this->listOfAsteriskManagers = new \SplDoublyLinkedList();

        $container = new Container();

        foreach ($configurations as $configuration)
        {
            $this->listOfAsteriskManagers->push($container->make(AsteriskManager::class,
                array('configuration' => $configuration)));
        }
    }
}

我真的很想了解如何在不违反 SOLID 原则的情况下使用 PHP-DI 容器。

【问题讨论】:

    标签: php oop dependency-injection php-di


    【解决方案1】:

    来自documentation

    如果您需要在服务、控制器或其他任何东西中使用 make() 方法,建议您针对 FactoryInterface * 进行类型提示。 这样可以避免将您的代码耦合到容器。 DI\FactoryInterface 会自动绑定到 DI\Container,因此您无需任何配置即可注入它。

    *强调我的

    所以你应该改变你的 AsteriskDispatcher 构造函数如下:

    public function __construct(FactoryInterface $factory) {
      // your code ...
      // more of your code ...
    
      $factory->make(AsteriskManager::class, ['configuration' => $configuration]);
    
      // the rest of your code.
    
    }
    

    PS:Singletonsareevil(大部分)。

    【讨论】:

    • 如果我的引导程序中需要一个容器实例,它是一个功能代码,该怎么办? AFAIK 容器只能将自身注入到 OOP 代码中。
    • 对不起,我不明白。帮不了你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2015-11-27
    • 2012-09-05
    • 1970-01-01
    • 2020-06-03
    • 2020-04-26
    • 1970-01-01
    相关资源
    最近更新 更多