web-dev-qa-db-ja.com

Symfony2はサービスコンテナでDoctrineを使用します

サービスコンテナで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
55
user1075510

コードによると、すでに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 ]

define 独自のservices.ymlファイルでバンドルのサービスを使用することを好みますが、それはもう少し高度なので、config.ymlを使用するだけで十分です。

85

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

これが私の最初の回答ですので、コメントをいただければ幸いです:)

9
MaXxer90

このコードを試してください:

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

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

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

次に、どのサービスでも、次のようなコンストラクターを介してエンティティマネージャー$em(または他のservice/controller)を挿入して使用できます。

// 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();
}
3
Niket Pathak

symfony3で作業する人のために:サービスコンテナでdoctrine=を使用するためにconfig/services.yml内で以下を実行する必要があります:

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

Symfony 3.4。でDoctrineをサービスで使用したい場合は、それを行うことができます:このメソッドのみが私のために働きました

services.yml

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

サービス

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

コントローラー

use YourBundle\PatchService\YourService;

     /**
         * @Route("/YourController/",name="YourController")
         */
        public function indexAction()
        {
            $em = $this->getDoctrine()->getManager();
            $Notification = new  YourService($em);
1
pedram shabani

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);
    }
}

より多くのコードと賛否両論のリストを見たいですか?

投稿を確認してください Doctrine Symfonyのサービスとして)でリポジトリを使用する方法

0
Tomáš Votruba

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;
 }

}
0
Hannoma