Symfony2在服务容器中使用Doctrine

时间:2011-12-01 13:17:58

标签: doctrine symfony

如何在服务容器中使用Doctrine?

代码只会导致错误消息“致命错误:调用未定义的方法...... :: get()”。

<?php

namespace ...\Service;

use Doctrine\ORM\EntityManager;
use ...\Entity\Header;

class dsdsf
{ 
    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public function create()
    {
        $id = 10;
        $em = $this->get('doctrine')->getEntityManager();
        $em->getRepository('...')->find($id);
    }
}

services.yml

service:
    site:
        class: ...\Service\Site

8 个答案:

答案 0 :(得分:85)

根据您的代码,您已经注入了EntityManager。您无需致电$em = $this->get('doctrine')->getEntityManager() - 只需使用$this->em

如果您尚未注入EntityManager,请阅读this

更新:

您需要让容器为您的服务注入EntityManager。以下是在config.yml中执行此操作的示例:

services:
    your.service:
        class: YourVendor\YourBundle\Service\YourService
        arguments: [ @doctrine.orm.entity_manager ]

我更喜欢在自己的services.yml文件中使用define捆绑服务,但这有点高级,因此使用config.yml就足以开始了。

答案 1 :(得分:9)

要轻松访问Entitymanager,请使用以下内容:

//services.yml
  your service here:
    class: yourclasshere
    arguments: [@doctrine.orm.entity_manager]

在课堂上:

class foo
{
  protected $em;



  public function __construct(\Doctrine\ORM\EntityManager $em)
  {
    $this->em = $em;
  }

  public function bar()
  {
      //Do the Database stuff
      $query = $this->em->createQueryBuilder();

      //Your Query goes here

      $result = $query->getResult();
  }
}

这是我的第一个答案,所以任何评论都表示赞赏:)

答案 2 :(得分:4)

请尝试以下代码:

 $em=$this->container->get('doctrine')->getEntityManager();

 $rolescheduels=$em->getRepository('OCSOCSBundle:RoleScheduel')->findByUser($user->getId());

答案 3 :(得分:3)

对于Symfony 3.x

对我来说,最简单易用的解决方案是打开自动装配/自动配置,然后通过构造函数注入我需要的服务。请注意,我还允许通过设置 resource: '../../src/AppBundle/*'

将任何控制器作为服务注入
 #services.yml or config.yml
 services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
    # Allow any controller to be used as a service
    AppBundle\:
        resource: '../../src/AppBundle/*'    
        # you can exclude directories or files
        # but if a service is unused, it's removed anyway
        exclude: '../../src/AppBundle/{Entity,Repository,Tests,DataFixtures,Form}'

然后在任何服务中,你可以注射&amp;通过构造函数使用实体管理器$em(或任何其他服务/控制器),如下所示:

// class xyz
private $em;
// constructor
public function __construct(\Doctrine\ORM\EntityManager $em)  {
    $this->em = $em;
}
public function bar() {
    //Do the Database stuff
    $query = $this->em->createQueryBuilder();
    //Your Query goes here
    $result = $query->getResult();
}

答案 4 :(得分:2)

对于使用symfony3的任何人:你需要在config / services.yml中执行以下操作才能在Service Container中使用doctrine:

servicename_manager:
          class: AppBundle\Services\MyServiceClass
          arguments: [ "@doctrine.orm.entity_manager" ]

答案 5 :(得分:1)

Symfony 3.4中的

如果要在服务中使用Doctrine,可以执行以下操作: 只有这种方法对我有用

services.yml

exit()

服务

YourBundle\PatchService\YourService:
      public: true
      arguments: [ '@doctrine.orm.entity_manager' ]

控制器

class YourService
{
    private $em;
    public function __construct($em)  {
        $this->em = $em;
    }

答案 6 :(得分:0)

自2017年以及Symfony 3.3 ,您可以将存储库注册为服务,具有其所具有的所有优势。

您的代码会发生这样的变化。

1。服务配置

# app/config/services.yml
services:
    _defaults:
        autowire: true

    ...\Service\:
       resource: ...\Service

2。创建新类 - 自定义存储库

use Doctrine\ORM\EntityManagerInterface;

class YourRepository
{ 
    private $repository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->repository = $entityManager->getRepository(YourEntity::class);
    }

    public function find($id)
    {
        return $this->repository->find($id);
    }
}

3。在任何控制器或服务中使用

class dsdsf
{ 
    private $yourRepository;

    public function __construct(YourRepository $yourRepository)
    {
        $this->yourRepository = $yourRepository;
    }

    public function create()
    {
        $id = 10;
        $this->yourRepository->find($id);
    }
}

您想查看更多代码和优缺点列表吗?

查看我的帖子How to use Repository with Doctrine as Service in Symfony

答案 7 :(得分:0)

我正在使用Symfony 3.4。如果你想在一个包中创建一个服务,这对我有用:

services:
 Vendor\YourBundle\Service\YourService:
   arguments:
     $em: '@doctrine.orm.entity_manager'

在您的Service.php中

<?php

namespace Hannoma\ElternsprechtagBundle\Service;

use Doctrine\ORM\EntityManager;
use Hannoma\ElternsprechtagBundle\Entity\Time;

class TimeManager
{
 protected $em;

 public function __construct(EntityManager $em)
 {
    $this->em = $em;
 }

}