Получить сущность из eventSubscriber

Я использую eventSubscriber для динамической загрузки поля (Paciente) в форму, в его функции preSubmit мне нужно получить в дополнение к идентификатору paciente, dni of paciente. Идентификатор я могу получить напрямую, но дню нужно принести сущность, и я не знаю, как мне это сделать отсюда.

Мое рассматриваемое событие выглядит следующим образом:

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

РЕДАКТИРОВАТЬ 1 МЕТОДА предварительно отправить с LifecycleEventArgs:

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

ОШИБКА в объявлении строки метода:

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

Решение

создать фабрику, чтобы ввести EntityManager или же Repository в ваш подписчик.

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

Зарегистрируй это

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

И добавить конструктор для вас, подписчик

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

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

// ...
}

Дайте мне знать, если это достаточно ясно

Для получения дополнительной информации проверьте: http://symfony2-document.readthedocs.io/en/latest/cookbook/service_container/factories.html

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector