我在php-project中使用PHP-DI 6容器。在我的程序开始时,我只是初始化容器并获取注入了所有依赖项的Application类。
$container = new Container();
$application = $container->get(Application::class);
$application->initialize();
$application->run();
Okey,太酷了,在下面的图片中,您可以看到我在项目中使用的类。
星号分派器被注入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容器。
答案 0 :(得分:2)
如果您需要在服务,控制器或其他任何内部使用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(主要)。