Использование PHP-DI для плагина Wordpress с использованием 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 в этом случае.


person emeraldjava    schedule 16.03.2018    source источник


Ответы (1)


Автомонтаж работает, проверяя подсказки типов параметров. В вашем конструкторе у вас есть Loader $loader.

Вам нужно поместить свой загрузчик в конфиг PHP-DI под ключ BHAA\utils\Loader, а не только loader (PHP-DI не будет волшебным образом угадывать вещи, используя только loader).

Так что замените 'loader' => $this->loader, на \BHAA\utils\Loader::class => $this->loader, и все будет хорошо.

person Matthieu Napoli    schedule 18.03.2018