내 자신의 서비스를 만들었고 EntityManager 교리를 주입해야하지만 __construct()
내 서비스에서 호출되는 것을 볼 수없고 주입이 작동하지 않습니다.
다음은 코드와 구성입니다.
<?php
namespace Test\CommonBundle\Services;
use Doctrine\ORM\EntityManager;
class UserService {
/**
*
* @var EntityManager
*/
protected $em;
public function __constructor(EntityManager $entityManager)
{
var_dump($entityManager);
exit(); // I've never saw it happen, looks like constructor never called
$this->em = $entityManager;
}
public function getUser($userId){
var_dump($this->em ); // outputs null
}
}
여기 services.yml
내 번들에 있습니다
services:
test.common.userservice:
class: Test\CommonBundle\Services\UserService
arguments:
entityManager: "@doctrine.orm.entity_manager"
config.yml
내 앱에서 .yml을 가져 왔습니다.
imports:
# a few lines skipped, not relevant here, i think
- { resource: "@TestCommonBundle/Resources/config/services.yml" }
컨트롤러에서 서비스를 호출하면
$userservice = $this->get('test.common.userservice');
$userservice->getUser(123);
나는 객체 (null이 아님)를 얻었지만 $this->em
UserService에서 null이고 이미 언급했듯이 UserService의 생성자가 호출되지 않았습니다.
한 가지 더, Controller와 UserService는 서로 다른 번들에 있지만 (정말로 프로젝트를 구성하는 데 필요합니다) 다른 모든 것이 잘 작동하며 전화를 걸 수도 있습니다.
$this->get('doctrine.orm.entity_manager')
UserService를 가져오고 유효한 (null이 아님) EntityManager 개체를 가져 오는 데 사용하는 동일한 컨트롤러에서.
UserService와 Doctrine 구성 사이의 구성 또는 일부 링크가 누락 된 것 같습니다.
답변
귀하의 클래스의 생성자 메서드를 호출해야 __construct()
하지 __constructor()
:
public function __construct(EntityManager $entityManager)
{
$this->em = $entityManager;
}
답변
최신 참조를 위해 Symfony 2.4 이상에서는 Constructor Injection 메서드의 인수 이름을 더 이상 지정할 수 없습니다. 문서 에 따르면 다음을 전달합니다.
services:
test.common.userservice:
class: Test\CommonBundle\Services\UserService
arguments: [ "@doctrine.orm.entity_manager" ]
그런 다음 인수를 통해 나열된 순서대로 사용할 수 있습니다 (1 개 이상인 경우).
public function __construct(EntityManager $entityManager) {
$this->em = $entityManager;
}
답변
참고로 Symfony 3.3 EntityManager는 감가 상각됩니다. 대신 EntityManagerInterface를 사용하십시오.
namespace AppBundle\Service;
use Doctrine\ORM\EntityManagerInterface;
class Someclass {
protected $em;
public function __construct(EntityManagerInterface $entityManager)
{
$this->em = $entityManager;
}
public function somefunction() {
$em = $this->em;
...
}
}
답변
2017 년부터 Symfony 3.3부터 Repository를 서비스로 등록 할 수 있으며 모든 장점이 있습니다.
더 일반적인 설명 은 내 게시물 How to use Repository with Doctrine as Service in Symfony 를 확인하십시오 .
특정 경우에 튜닝이 포함 된 원본 코드는 다음과 같습니다.
1. 귀하의 서비스 또는 컨트롤러에서 사용
<?php
namespace Test\CommonBundle\Services;
use Doctrine\ORM\EntityManagerInterface;
class UserService
{
private $userRepository;
// use custom repository over direct use of EntityManager
// see step 2
public function __constructor(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function getUser($userId)
{
return $this->userRepository->find($userId);
}
}
2. 새 사용자 지정 저장소 만들기
<?php
namespace Test\CommonBundle\Repository;
use Doctrine\ORM\EntityManagerInterface;
class UserRepository
{
private $repository;
public function __construct(EntityManagerInterface $entityManager)
{
$this->repository = $entityManager->getRepository(UserEntity::class);
}
public function find($userId)
{
return $this->repository->find($userId);
}
}
3. 서비스 등록
# app/config/services.yml
services:
_defaults:
autowire: true
Test\CommonBundle\:
resource: ../../Test/CommonBundle