我用php-di缠住了依赖注入,但是我显然做得不好。想知道是否有人可以告诉我我在做什么错。
好吧,有一个bootstrap.php文件,其中没有名称空间,看起来像:
`<?php
use myapp\app;
use myapp\interfaces\db;
use Psr\Log\LoggerInterface;
use myapp\lib\log;
/// A bunch more 'use' statements here ///
// Start app. The myapp\loader() class extends DI\Container, hence is also the HTTP container.
$app = new myapp\loader();
// Set classes
$app->set(app::class, $app);
$app->set(loggerInterface::class, $app->make(log::class, ['channel_name' => 'some_changeable_name']));
$app->set(db::class, $app->make(myapp\lib\mysql::class));
// Return
return $app;
我确定您至少可以看到我正在尝试做的事情,并且它在技术上是可行的,尽管我确定我做错了。
我希望它是可互换的,因此,例如,您可以轻松地将Internet记录器翻转为monolog / monolog程序包,或更改默认日志通道名称,或将数据库驱动程序翻转为mysql以外的其他类,等等。
但是,这些类彼此依赖,因此必须按此顺序设置,并且如果放置在ContainerBuilder-> AddDefinitions()方法中,则会引发错误,指出无法解析app :: class。例如,log :: class构造函数注入了'app:class',db :: class构造函数注入了app :: class和loggerInterface :: class等,另外,我需要能够在定义这些参数时,将基于名称的参数放入其中。
任何见解都会有所帮助,因为我高度怀疑这是实现此目标的最佳方法,即使它确实有效。我是否应该只将容器注入到每个这些调用中,然后通过“ container-> get()”方法获取必要的对象/类?如果我可以直接将其直接注入到构造函数中,那将更好,更容易阅读。
任何帮助/见解将不胜感激。