我正在使用 https://github.com/DevinVinson/WordPress-Plugin-Boilerplate 模板编写一个wordpress插件,我正在尝试配置PHP-DI(http://php-di.org/)来处理跨插件的类注入。
我的作曲家配置是这个
{
"name" : "emeraldjava/bhaa_wordpress_plugin",
"description" : "bhaa_wordpress_plugin",
"type" : "wordpress-plugin",
"require": {
"php-di/php-di": "^6.0"
},
"autoload" : {
"psr-4" : {
"BHAA\" : "src"
}
}
}
在我的 Main.php 类中,我正在创建 PHP-DI 容器对象,我希望自动连线应该生效,所以我没有 需要在 addDefinitions() 方法中注册大量对象。
use DIContainerBuilder;
use function DIautowire;
use function DIcreate;
class Main {
public function __construct() {
// This is the current manual initialisation of the Loader class. I want to be able to inject this object reference
$this->loader = new utilsLoader();
$this->buildContainer();
}
private function buildContainer() {
$builder = new ContainerBuilder();
$builder->addDefinitions([
// I add the object definition to the container here
'loader' => $this->loader,
]);
$this->container = $builder->build();
}
}
我有一个名为 LeagueCPT 的新类,我想在其中注入加载器对象引用
namespace BHAAfrontcpt;
use BHAAutilsLoader;
class LeagueCPT {
private $loader;
public function __construct(Loader $loader) {
// i'm expecting that Loader will be injected here but it's null
}
}
在原始代码中,我会手动创建 LeagueCPT 并手动传递引用,如下所示
class Main {
public function __construct() {
$this->leagueCpt = new frontcptLeagueCPT($this->loader);
}
}
我现在期待我应该能够调用容器为我创建一个注入正确构造函数的联盟新对象
class Main {
public function __construct() {
$this->leagueCpt = $this->getContainer()->get(LeagueCPT);
}
}
但在每种情况下,我都看不到 LeagueCPT 被 PHP-DI 初始化。在这种情况下,我将不胜感激有关如何正确配置 DI 系统的任何建议。
自动连线通过检查参数的类型提示来工作。在您的构造函数中,您有Loader $loader
.
你需要把你的加载器放在 PHP-DI 配置的BHAAutilsLoader
键下,而不仅仅是loader
(PHP-DI 不会只用loader
神奇地猜测事情)。
所以用BHAAutilsLoader::class => $this->loader,
代替'loader' => $this->loader,
,你应该很好。