如何将Doctrine Entity Manager注入Symfony 4服务

时间:2018-04-02 21:03:14

标签: symfony doctrine symfony4

我有一个控制器

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']

4 个答案:

答案 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();
    }
}