program tip

서비스 컨테이너에서 Symfony2 사용 교리

radiobox 2021. 1. 7. 07:51
반응형

서비스 컨테이너에서 Symfony2 사용 교리


서비스 컨테이너에서 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 읽으십시오 .

최신 정보:

컨테이너가 EntityManager서비스에 주입 되도록해야합니다. 다음은에서 수행하는 예입니다 config.yml.

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

번들의 서비스를 자체 파일 정의 하는 것을 선호 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());

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(또는 다른 서비스 / 컨트롤러 )를 주입하고 사용할 수 있습니다 .

// 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를 사용하는 모든 사용자 : 서비스 컨테이너에서 교리를 사용하려면 config / services.yml 내부에서 다음을 수행해야합니다.

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

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

}

in the Symfony 3.4. If you want to use Doctrine in a service you can do it: Only this method worked for me

services.yml:

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

Service:

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

Controller:

use YourBundle\PatchService\YourService;

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

Since 2017 and Symfony 3.3 you can register Repository as service, with all its advantages it has.

Your code would change like this.

1. Service configuration

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

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

2. Create new class - custom repository:

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. Use in any Controller or Service like this

class dsdsf
{ 
    private $yourRepository;

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

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

Do you want to see more code and pros/cons lists?

Check my post How to use Repository with Doctrine as Service in Symfony.

ReferenceURL : https://stackoverflow.com/questions/8342031/symfony2-use-doctrine-in-service-container

반응형