2017-05-24 17 views
0

私は、フィールド(Paciente)をフォームに動的にロードするためにeventSubscriberを使用しています.pacienteのID、pacienteのIDに加えて取得する必要があるpreSubmit関数でフォームに挿入します。 idは私が直接得ることができますが、dniはエンティティを持ってくる必要があり、私はここからどのようにできるのか分かりません。次のようにeventSubscriberからエンティティを取得

問題の私のイベントは次のとおりです。LifecycleEventArgsとMETHOD preSubmit OF

class AddHistoriaClinicaFieldSubscriber implements EventSubscriberInterface 
{ 
    private $propertyPathToHistoriaClinica; 
    public function __construct($propertyPathToHistoriaClinica) 
    { 
     $this->propertyPathToHistoriaClinica = $propertyPathToHistoriaClinica; 
    } 
    public static function getSubscribedEvents() 
    { 
     return array(
      FormEvents::POST_SET_DATA => 'preSetData', 
      FormEvents::PRE_SUBMIT => 'preSubmit' 
     ); 
    } 
    private function addHistoriaClinicaForm($form, $paciente_id) 
    { 
     $formOptions = array(
      'class'   => 'BiobancoBundle:HistoriaClinica', 
      'empty_value' => '-- SELECCIONAR HISTORIA CLINICA --', 
      'label'   => 'Historia Clínica', 
      'attr'   => array(
       'class' => 'historia_clinica_selector', 
      ), 
      'query_builder' => function (EntityRepository $repository) use ($paciente_id) { 
       $qb = $repository->createQueryBuilder('h') 
        ->innerJoin('h.paciente', 'p') 
        ->where('p.id = :p') 
        ->setParameter('p', $paciente_id) 
       ; 
       return $qb; 
      }, 
     ); 
     $form->add($this->propertyPathToHistoriaClinica, 'entity', $formOptions); 
    } 
    public function preSetData(FormEvent $event) 
    { 
     $data = $event->getData(); 
     $form = $event->getForm(); 
     if (null === $data) { 
      return; 
     } 
     $accessor = PropertyAccess::createPropertyAccessor(); 
     $h  = $accessor->getValue($data, $this->propertyPathToHistoriaClinica); 
     $paciente_id = ($h) ? $h->getPaciente()->getNumeroIdentificacion() : null; 
     $this->addHistoriaClinicaForm($form, $paciente_id); 
    } 
    public function preSubmit(FormEvent $event) 
    { 
     $data = $event->getData(); 
     $form = $event->getForm(); 
     $paciente_id = array_key_exists('paciente', $data) ? $data['paciente'] : null; 
     //HERE IS WHERE I NEED TO OBTAIN THE DNI, TO PASS IT TO THE FORM 
     //dump($data);die(); 
     $this->addHistoriaClinicaForm($form, $paciente_id); 
    } 
} 

は、EDIT 1:メソッドの行の宣言で

use Doctrine\ORM\Event\LifecycleEventArgs; 

... 

public function preSubmit(FormEvent $event, LifecycleEventArgs $args) 
    { 
     $data = $event->getData(); 
     $form = $event->getForm(); 
     $paciente_id = array_key_exists('paciente', $data) ? $data['paciente'] : null; 
     dump($args->getEntityManager()->getRepository("BiobancoBundle:Paciente")->find($paciente_id));die(); 
     $this->addHistoriaClinicaForm($form, $paciente_id); 
    } 

ERROR:

Catchable Fatal Error: Argument 2 passed to BiobancoBundle\Form\EventListener\AddHistoriaClinicaFieldSub‌​scriber::preSubmit() must be an instance of Doctrine\ORM\Event\LifecycleEventArgs, string given. 
+0

よあなたは 'paciente'を取得するためにQueryBuilderを使用していますが、その結果はあなたにプロパティを与えませんか? – Dymen1

+0

こんにちは@ Dymen1、クエリビルダでは、すべてのhistoryia_clinicaを取得します。ここで、p.dni = dniのpacienteです。以前はどのようにdniを得ることができますか? –

+0

ファクトリを作成し、依存関係注入を処理する方法を知っていますか?もしそうなら、あなたは 'paciente'リポジトリを注入する必要があります。その後、リポジトリを介してエンティティを見つけることができます。 (そうでない場合は、私は答えとして例を作成するかもしれませんが、あなたはすでにこれを行う方法を知っていれば少し些細です) – Dymen1

答えて

0

作成工場にEntityManagerまたはRepositoryを注入するur加入者。

class AddHistoriaClinicaFieldSubscriberFactory 
{ 
    public static function create($entityManager)// typehint this 
    { 
     // You could retrieve the repo here, so you don't pass the whole em to the instance 
     $instance = new AddHistoriaClinicaFieldSubscriber($entityManager); 

     // ... 

     return $instance; 
    } 
} 

、これはより多くの情報の確認のために

十分にクリアされている場合、私に教えてください

class AddHistoriaClinicaFieldSubscriber implements EventSubscriberInterface 
{ 
    // ... 
    protected $entityManager; 

    public function __construct($entityManager) {// typehint this 
     $this->entityManager = $entityManager; 
    } 

    // ... 
} 

加入者

# app/config/services.yml 

services: 
# ... 

    app.add_historia_clinica_field_subscriber_factory: 
    class: YOURNAMESPACE\AddHistoriaClinicaFieldSubscriberFactory 

    app.add_historia_clinica_field_subscriber: 
     class:  YOURNAMESPACE\AddHistoriaClinicaFieldSubscriber 
     factory: 'add_historia_clinica_field_subscriber_factory:create' 
     arguments: ['@doctrine.orm.default_entity_manager'] 
     tags: 
     - { name: WHATEVERYOUHAVEHERE } 

それを登録し、あなたにコンストラクタを追加します。http://symfony2-document.readthedocs.io/en/latest/cookbook/service_container/factories.html

関連する問題