如何从我想要的任何类中获取PHP-DI容器的实例?

时间:2019-01-14 07:25:06

标签: php oop php-di

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

    $container = new Container();

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

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

Okey,太酷了,在下面的图片中,您可以看到我在项目中使用的类。

class diagram

星号分派器被注入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容器。

1 个答案:

答案 0 :(得分:2)

来自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:Singletons are evil(主要)。