У меня есть контроллер
use Doctrine\ORM\EntityManagerInterface:
class ExampleController{
public function someFunction(ExampleService $injectedService){
$injectedService->serviceFunction();
}
}
С сервисом
use Doctrine\ORM\EntityManagerInterface;
class ExampleService{
public function __construct(EntityManagerInterface $em){
...
}
}
Однако вызовы someFunction() завершаются ошибкой из-за того, что передается 0 параметров (EntityManagerInterface не внедряется). Я пытаюсь использовать EntityManager из службы. Авто проводка включена. Я пробовал решения для Symfony3, но они, похоже, не работают, если я чего-то не упускаю.
Обновлено: вот мой services.yaml:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\:
resource: '../src/*'
exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
@ Smaïne Да, добавила сейчас. Некоторые решения Symfony 2/3 имеют services: your.service.here: class: app\service\here arguments: [@doctrine.orm.entity_manager], но я не уверен на 100% в том, что я указал правильный сервис и класс обслуживания, или если это даже применимо к моему сценарию.
Вы можете сообщить мне об ошибке, у меня такая же конфигурация, и она работает для меня
если вы сами позвоните в someFunction(), вы обязаны предоставить введенную услугу .. Я ничего не могу сделать для вас.
Вы когда-нибудь находили решение? У меня точно такая же проблема.




Классический сервис Symfony с автоматическим подключением использует метод внедрения конструктора для внедрения зависимостей. В вашем случае у вас нет конструктора.
Вы можете добавить метод конструктора и установить зависимость для свойства частного класса. И используйте соответственно.
Или вы можете использовать сеттер инъекций.
Конфигурация услуги:
services:
app.example_controller:
class: Your\Namespace\ExampleController
calls:
- [setExampleService, ['@exampleService']]
Класс контроллера:
class ExampleController
{
private $exampleService;
public function someFunction() {
$this->exampleService->serviceFunction();
}
public function setExampleService(ExampleService $exampleService) {
$this->exampleService = $exampleService;
}
}
Класс ExampleService содержит конструктор. Несмотря на отсутствие во фрагменте, у службы есть свойство em, а у конструктора - $this->em = $em. В документации указано: «Вы можете указать [аргумент в YAML]». Формулировка заставила меня подумать, что это необязательно. Действительно ли это требуется?
Как выполнить метод класса ExampleController-> someFunction? Не могли бы вы представить контекст? Если вы выполняете этот метод вручную, вам необходимо передать зависимость. Это ожидаемое поведение.
Согласен с Яримадамом. Контейнер служб, внедрение зависимостей и автоматическое подключение - это не история о внедрении в методы. Зависимости, внедренные в объекты, которые мы называем «услугами».
Когда приложение запущено, создается сервисный контейнер, внедряющий одни сервисы в другие через конструктор класса или вызов метода «set».
Ваш ExampleController::someFunction предназначен для вызова только вами, поэтому единственный способ, которым этот метод получит $injectedService в качестве аргумента, - это то, что вы его явно передадите. Это неправильный путь.
Я знаю, что это старый пост, но на случай, если кто-то с этим не справится, в статусе использования есть опечатка:
use Doctrine\ORM\EntityManagerInterface: //<- see that's a colon, not a semicolon
Используйте только в Symfony 4.
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Name; //if you use entity for example Name
class ExampleService{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
function newName($code) // for example with a entity
{
$name = new Name();
$name->setCode($code); // use setter for entity
$this->em->persist($name);
$this->em->flush();
}
}
Но выдает ошибку: MyService::__construct() must implement interface Doctrine\ORM\EntityManagerInterface, string given
Ваш код должен работать с автоматическим подключением, можем ли мы увидеть ваш services.yaml