#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’). Какую часть мне нужно внедрить?