Использование PHP-DI для Wordpress Plugin с использованием PSR-4?
Я пишу плагин WordPress, используя шаблон https://github.com/DevinVinson/WordPress-Plugin-Boilerplate и пытаюсь настроить 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 DI\ContainerBuilder;
use function DI\autowire;
use function DI\create;
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 utils\Loader();
$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, куда я хотел бы добавить ссылку на объект Loader
namespace BHAA\front\cpt;
use BHAA\utils\Loader;
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 front\cpt\LeagueCPT($this->loader);
}
}
Теперь я ожидаю, что смогу вызвать Контейнер, чтобы создать новый объект для Лиги с введенным правильным конструктором.
class Main {
public function __construct() {
$this->leagueCpt = $this->getContainer()->get(LeagueCPT);
}
}
но в каждом случае я не вижу инициализации LeagueCPT с помощью PHP-DI. Буду признателен за любые предложения о том, как правильно настроить систему DI в этом случае.
1 ответ
Автопроводка работает, проверяя подсказки параметров. В вашем конструкторе у вас есть Loader $loader
,
Вы должны поместить свой загрузчик в конфигурацию PHP-DI под BHAA\utils\Loader
ключ, а не только loader
(PHP-D я не буду угадывать вещи волшебным loader
).
Так замени 'loader' => $this->loader,
от \BHAA\utils\Loader::class => $this->loader,
и тебе должно быть хорошо.