поделитесь опытом работы с контейнерами зависимости.
Добрый день.
Разбираюсь в работе контейнера зависимостей php-di.org
и возникло у меня недопонимание.
Есть у меня два класса (они загружаются автоматически через composer)
Пока я разруливаю зависимость сам, создавая экземпляр класс service2 и передавая его в конструктор service1 все работает ожидаемо.
Но вот здесь
php-di.org/doc/getting-started.html
в примере говорится, что php/di как раз и создан чтобы избегать ручного решения зависимостей, мол достаточно теперь просто запросить создание service1 через метод контейнера и он создаст и service1 и service2. При условии что у контейнера включена автозагрузка Autowiring
Uncaught DI\NotFoundException: No entry or class found for 'Service1'
Подскажите, что делаю не так? Или я не понимаю саму суть работы контейнера зависимости и создание объекта класса Service1 нужно в контейнер внедрить, а он может только разруливать зависимости? Но тогда пример на странице php-di.org/doc/getting-started.html выглядит вводящим в заблуждение. Там есть так же два класса, один зависит от второго и в итоге написано что если не хочешь руками то просто вызови
Разбираюсь в работе контейнера зависимостей php-di.org
и возникло у меня недопонимание.
Есть у меня два класса (они загружаются автоматически через composer)
namespace App\Front\Services;
use App\Front\Services\Service2;
class Service1 {
public $service2;
public function __construct(Service2 $service){
$this->service2 = $service;
}
function getResult(){
return $this->service2->name;
}
}
иnamespace App\Front\Services;
class Service2 {
public $name = "i am service two";
}
Сервис один зависит от сервиса два, поэтому он в него внедрен как зависимость.Пока я разруливаю зависимость сам, создавая экземпляр класс service2 и передавая его в конструктор service1 все работает ожидаемо.
Но вот здесь
php-di.org/doc/getting-started.html
в примере говорится, что php/di как раз и создан чтобы избегать ручного решения зависимостей, мол достаточно теперь просто запросить создание service1 через метод контейнера и он создаст и service1 и service2. При условии что у контейнера включена автозагрузка Autowiring
$builder = new DI\ContainerBuilder();
$builder->useAutowiring(true); // специально создаю через билдер чтобы однозначно включить Autowiring
$container = $builder->build();
$s = $container->get('Service1');
echo $s->getResult();
У меня не работает.Uncaught DI\NotFoundException: No entry or class found for 'Service1'
Подскажите, что делаю не так? Или я не понимаю саму суть работы контейнера зависимости и создание объекта класса Service1 нужно в контейнер внедрить, а он может только разруливать зависимости? Но тогда пример на странице php-di.org/doc/getting-started.html выглядит вводящим в заблуждение. Там есть так же два класса, один зависит от второго и в итоге написано что если не хочешь руками то просто вызови
Instead, we can let PHP-DI figure out the dependencies:
$userManager = $container->get('UserManager');
Behind the scenes, PHP-DI will create both a Mailer object and a UserManager object.
спасибо.