サービスコンテナで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
コードによると、すでに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
を使用するだけで十分です。
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();
}
}
これが私の最初の回答ですので、コメントをいただければ幸いです:)
このコードを試してください:
$em=$this->container->get('doctrine')->getEntityManager();
$rolescheduels=$em->getRepository('OCSOCSBundle:RoleScheduel')->findByUser($user->getId());
私にとって最も簡単な解決策は、自動配線/自動構成をオンにしてから、コンストラクタを介して必要なサービスを注入することでした。 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();
}
symfony3で作業する人のために:サービスコンテナでdoctrine=を使用するためにconfig/services.yml内で以下を実行する必要があります:
servicename_manager:
class: AppBundle\Services\MyServiceClass
arguments: [ "@doctrine.orm.entity_manager" ]
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);
2017年およびSymfony 3.3以降できますリポジトリをサービスとして登録、その利点をすべて備えています。
コードは次のように変更されます。
# app/config/services.yml
services:
_defaults:
autowire: true
...\Service\:
resource: ...\Service
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);
}
}
class dsdsf
{
private $yourRepository;
public function __construct(YourRepository $yourRepository)
{
$this->yourRepository = $yourRepository;
}
public function create()
{
$id = 10;
$this->yourRepository->find($id);
}
}
より多くのコードと賛否両論のリストを見たいですか?
投稿を確認してください Doctrine Symfonyのサービスとして)でリポジトリを使用する方法。
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;
}
}