-1

엔티티 리포지토리가 필요한 양식 이벤트 가입자가 있습니다. 이 구독자가 여러 가지 형태로 필요하기 때문에이 저장소 종속성을 구독자 및 그 부모의 생성자를 사용하지 않고 이상적으로 주입하고 싶습니다.symfony2 의존성 최적화 삽입

그래서 기본적으로 나는 다음과 같은 체인이 있습니다

컨트롤러 호출을 -> CustomManagerService instantiates-> 양식이 인스턴스화 -> EventSubscriber needs-> EntityRepository

maanager 이미 서비스입니다. 관리자를 통해 양식을 통해 생성자 저장소 인수를 가입자에게 전송하는 것은 모두 고통이며 각 양식을 서비스로 설정하는 것은 어려움이 있습니다.

구독자의 저장소를 직접 인스턴스화 할 수없는 이유는 무엇입니까? 나는 그것이 나쁜 습관이라고 읽었다.

편집 :

$unitRepository = $this->getDoctrine()->getRepository('UnitRepository'); 
$myManager = $this->get('my_manager') 
$form = $myManager->createForm($unitRepository); 

myManager에서 : 내 양식에

public function createForm(UnitRepository $unitRepository){ 
return $this->formFactory->createForm(
new xxxType($unitRepository) 
} 

:

use MyBundle/AddUnitFieldSubscriber; 
protected $unitRepository; 

public function __construct(UnitRepository $unitRepository) 
{ 
$this->unitRepository = $unitRepository; 
} 

public function buildform() 
{ 
$builder->addEventSubscriber(new AddUnitFieldSubscriber($this->unitRepository)); 
} 

내 컨트롤러에서

: 이것은 내가 지금까지 무엇을 가지고 내 구독자 : 보호 된 $ unitRepository;

public function __construct(UnitRepository $unitRepository) 
{ 
$this->unitRepository = $unitRepository; 
} 
public function preSetData(FormEvent $event) 
    { 
$unitRepository = $this->unitRepository; 
$unitRepository->doStuff() 
} 

매우 가벼우 며 때로는 eventSubscriber를 사용하는 하위 양식을 호출하는 양식이 있습니다. 양식을 서비스로 설정하면 필요한 첫 번째 구성 매개 변수없이 인스턴스를 생성하기 때문에 오류가 발생하기도합니다.

구독자 만 저장소에 액세스해야한다는 것을 알기에 가장 짧은 경로는 무엇이며이를 반복하지 않을까요?

고맙습니다.

+0

서비스 정의를 표시 할 수 있습니까? – tomazahlin

+0

저장소를 인스턴스화하려면 엔티티 관리자에 대한 액세스 권한이 필요합니다 (저는 Doctrine 2를 사용하고 있다고 가정합니다). 따라서 구독자에서 저장소를 직접 인스턴스화하면 도움이되지 않습니다. 양식에 추가 서비스가 필요하면 양식을 서비스로 만듭니다. 몇 번 해보신 후에는 쉽습니다. 가입자를 서비스로 만들어 양식에 삽입 할 수도 있습니다. – Cerad

+0

@Cerad, 양식을 서비스로 만들어야합니까? 인수없이 새로운 xxxType()과 같은 관리자의 양식을 계속 인스턴스화하면 오류가 발생한다는 느낌이 들지 않습니까? –

답변

0

저는 모든 것을 이해할 수 있을지 모르겠지만, 어떤 것도 이해할 수는 없지만 응답을 시도 할 것입니다.

SubscriberProvider 서비스를 정의하는 것이 좋습니다.이 서비스는 구독자의 인스턴스 생성과 구독자의 설정자를 통한 구독자의 저장소 삽입에 대한 책임이 있습니다. get, retrieve, create, provide 또는 선호하는 서비스 SubscriberProvider을 사용하여 구독자의 인스턴스를 검색 할 수 있습니다. 그런 다음이 제공자를 다른 서비스에 주입 할 수 있습니다.

services: 
    your_own_bundle.form.type.unit: 
     class: Your\OwnBundle\Form\Type\UnitType 
     arguments: 
      - "@doctrine" 
     tags: 
      - { name: form.type, alias: unit } 

그리고 동급 : 다음

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Doctrine\Common\Persistence\ManagerRegistry; 
use Your\OwnBundle\Event\AddUnitFieldSubscriber; 

class UnitType extends AbstractType 
{ 
    protected $unitRepository; 

    public function __construct(ManagerRegistry $doctrine) 
    { 
     $this->unitRepository = $doctrine->getRepository('UnitRepository'); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->addEventSubscriber(
      new AddUnitFieldSubscriber($this->unitRepository) 
     ); 
    } 

, 당신은 같은 유형을 사용할 수 있습니다 여기에 편집

은 양식 유형과 관련된 서비스의 정의입니다 그 :

$builder->add('available_unit', 'unit', array()); 

이렇게하면 저장소에 저장소를 전달할 필요가 없습니다.

+0

전체 코드 예제를 추가했습니다. 당신의 솔루션은 이미 가지고있는 많은 것들 위에 더 중개하지 않겠습니까? –

+0

공급자에서 저장소를 가져올 코드를 설정하십시오. 양식을 서비스로 설정하십시오. 양식 서비스에서 공급자를 주입하십시오. 형태로 공급자를 사용하여'AddUnitFieldSubscriber'의 인스턴스를 얻습니다. 이 방법으로 문제가 발생하지 않을 것입니다. '나는 때때로 오류가 발생합니다. 왜냐하면 필자는 필요한 첫 번째 constructur 매개 변수없이 인스턴스를 생성하기 때문입니다.' – Gnucki

+0

지금까지 내 양식은 새 xxxType ($ this-> unitRepository)을 사용하여 사용자 정의 관리자 클래스에서 인스턴스화되었습니다. 만약 내가 그것을 서비스로 변환, 내 컨트롤러에서 전화를 인수로 전달해야합니다 내 xxxType() 내 관리자 클래스에서 공급자 생성자 인수 ('오류, 공급자 예상, null 주어진'). 내가 맞습니까? 그리고 나서 그것은 복잡해지기 전에 –