使用 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;
我相信您至少可以看到我正在尝试做的事情,并且它在技术上确实有效,尽管我确信我做错了。
我希望它可以互换,例如,您可以轻松地为 monolog/monolog 包翻转 Internet 记录器,或更改默认日志通道名称,或将数据库驱动程序翻转为 mysql 以外的某个类等。
但是,这些类相互依赖,因此必须按此顺序设置,如果放在 ContainerBuilder->AddDefinitions() 方法中,它只会抛出一个错误,说 app::class 无法解析。例如,log::class 构造函数注入了“app:class”,db::class 的构造函数同时注入了 app::class 和 loggerInterface::class 等。另外,我需要能够在定义这些时放入基于名称的参数。
任何见解都会有所帮助,因为我非常怀疑这是最好的方法,即使它确实有效。我是否应该只将容器注入到每个调用中,然后通过“container->get()”方法获取必要的对象/类?如果我可以直接注入构造函数,它会更好,更容易阅读。
任何帮助/见解将不胜感激。