Symfony2 не удается создать экземпляр интерфейса при внедрении зависимостей

#php #symfony #dependency-injection

#php #symfony #внедрение зависимостей

Вопрос:

У меня проблема, когда я пытаюсь создать сервис в Symfony2.

Это мои services.yml

 services:
    Menu:
        class:  MyWebBundleClassesSystemMenu        
        arguments: [@service_container]
  

Это мое сервисное меню:

 namespace MyWebBundleClassesSystem;

use SymfonyComponentDependencyInjectionContainerInterface as Container;

Class Menu{
    private $container;

    public function __construct(Container $container) {                
        $this->container = $container;                
    }

    public function getMenu($section) {
        return "hello";
    }
}
  

Когда в контроллере я делаю:

 $menu = $this->get('Menu');
  

Я получаю:

FatalErrorException: Ошибка: не удается создать экземпляр интерфейса My WebBundle Classes System Menu в …cachedevappDevDebugProjectContainer.php строка 1522

Конечно, я почистил кеш.

Ответ №1:

Измените инструкцию use на;

 use SymfonyComponentDependencyInjectionContainer;
  

Также я бы переопределил аргументы, заключающие имя службы в кавычки.

 services:
    Menu:
        class:  MyWebBundleClassesSystemMenu        
        arguments: ["@service_container"]
  

Я бы задался вопросом, почему вы вводите весь контейнер.
Почему бы просто не внедрить нужные вам части?

Если вы также определяете свой контроллер как службу, вы можете получить доступ к своей службе меню, внедрив ее в свой контроллер.

ДОПОЛНИТЕЛЬНО СОГЛАСНО ЗАПРОСУ КОММЕНТАРИЯ;

 services:
        Menu:
            class:  MyWebBundleClassesSystemMenu        
            arguments: ["@router"]
  

И класс будет выглядеть так;

 <?php 
namespace MyWebBundleClassesSystem;

use SymfonyComponentRoutingRouterInterface;

Class Menu{
    private $router;

    public function __construct(RouterInterface $router) {                
        $this->router = $router;                
    }

    public function getMenu($section) {
        return "hello";
    }
}
  

Комментарии:

1. Thansk, мне нужно только сгенерировать пользовательский маршрутизатор, чтобы можно было использовать $this->get(‘router’). Какую часть мне нужно внедрить?