我有一个控制器
use Doctrine\ORM\EntityManagerInterface:
class ExampleController{
public function someFunction(ExampleService $injectedService){
$injectedService->serviceFunction();
}
}
使用服务
use Doctrine\ORM\EntityManagerInterface;
class ExampleService{
public function __construct(EntityManagerInterface $em){
...
}
}
但是,由于传递了0个参数(未注入EntityManagerInterface),对someFunction()
的调用失败。我试图使用服务中的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']
答案 0 :(得分:2)
同意Yarimadam。服务容器,依赖注入和自动装配不是关于注入方法的故事。注入我们称之为“服务”的对象的依赖关系。
当应用程序启动时,构建服务容器,通过类构造函数或“set”方法调用将一个服务注入另一个服务。
您的ExampleController::someFunction
只能由您调用,所以只有这种方法接收$injectedService
作为参数的方式才会明确地传递它。这是错误的方式。
答案 1 :(得分:1)
使用自动装配的经典symfony服务使用构造函数注入方法来注入依赖项。在您的情况下,您没有构造函数。
您可以考虑添加构造函数方法并将依赖项设置为私有类属性。并相应地使用。
或者您可以使用setter injection。
服务配置:
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;
}
}
答案 2 :(得分:1)
我知道这是一篇过时的文章,但是以防万一,有人在使用说明中有错字:
use Doctrine\ORM\EntityManagerInterface: //<- see that's a colon, not a semicolon
答案 3 :(得分:0)
仅在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();
}
}