Контейнер не устанавливается при попытке использовать ContainerAwareInterface

С Symfony 2.8 этот код $this->container нулевой.

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;

class EntrarYPreregistroFormSubscriber implements EventSubscriberInterface, ContainerAwareInterface
{
use ContainerAwareTrait;

public function preSetData(FormEvent $event)
{
$l = $this->container->get('logger');
$l->notice('GOT LOGGER');
}

....
}

И мой EntrarYPreregistroFormSubscriber Сервис настроен как:

pmktconcursos.entrarypreregistro.form.subscriber:
class: PMKT\ConcursosBundle\EventListener\EntrarYPreregistroFormSubscriber
calls:
- [ setContainer,[ "@service_container" ] ]

Я получаю исключение в $l = $this->container->get('logger');

request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalErrorException: "Error: Call to a member function get() on a non-object" at /Users/vmarquez/Proyectos/GrupoPMKT/Promoticket/current/dev/chedraui1607/chedraui1607/src/PMKT/ConcursosBundle/Form/EventListener/EntrarYPreregistroFormSubscriber.php line 30 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 0): Error: Call to a member function get() on a non-object at /Users/vmarquez/Proyectos/GrupoPMKT/Promoticket/current/dev/chedraui1607/chedraui1607/src/PMKT/ConcursosBundle/Form/EventListener/EntrarYPreregistroFormSubscriber.php:30)"}

Я что-то пропустил?

0

Решение

Вы создаете прослушиватель событий формы, поэтому внутри вашего типа формы у вас есть что-то вроде $builder->addEventSubscriber(new EntrarYPreregistroFormSubscriber()); так что вы можете видеть, что прослушиватели событий формы работают с небольшим отличием от обычного прослушивателя событий. Как вы создаете объект, так это вы должны назвать setContainer($serviceContainer), Для этого у вас должен быть сервисный контейнер внутри вашей формы. Чтобы сделать это, вы должны передать его как опцию при создании формы в контроллере.

// in controller
$object = ...;
$form = $this->createForm(new YourFormType(), $object, array('service_container' => $this->get('service_container')));

// in YourFormType
$listener = new EntrarYPreregistroFormSubscriber();
$listener->setContainer($options['service_container']);
$builder->addEventSubscriber($listener);
...
// in setDefaultOptions method
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
...
'service_container' => null,
));
}
1

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

С Symfony 2.8 этот код $this->container нулевой.

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;

class EntrarYPreregistroFormSubscriber implements EventSubscriberInterface, ContainerAwareInterface
{
use ContainerAwareTrait;

public function preSetData(FormEvent $event)
{
$l = $this->container->get('logger');
$l->notice('GOT LOGGER');
}

....
}

И мой EntrarYPreregistroFormSubscriber Сервис настроен как:

pmktconcursos.entrarypreregistro.form.subscriber:
class: PMKT\ConcursosBundle\EventListener\EntrarYPreregistroFormSubscriber
calls:
- [ setContainer,[ "@service_container" ] ]

Я получаю исключение в $l = $this->container->get('logger');

request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalErrorException: "Error: Call to a member function get() on a non-object" at /Users/vmarquez/Proyectos/GrupoPMKT/Promoticket/current/dev/chedraui1607/chedraui1607/src/PMKT/ConcursosBundle/Form/EventListener/EntrarYPreregistroFormSubscriber.php line 30 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 0): Error: Call to a member function get() on a non-object at /Users/vmarquez/Proyectos/GrupoPMKT/Promoticket/current/dev/chedraui1607/chedraui1607/src/PMKT/ConcursosBundle/Form/EventListener/EntrarYPreregistroFormSubscriber.php:30)"}

Я что-то пропустил?

0

Вы создаете прослушиватель событий формы, поэтому внутри вашего типа формы у вас есть что-то вроде $builder->addEventSubscriber(new EntrarYPreregistroFormSubscriber()); так что вы можете видеть, что прослушиватели событий формы работают с небольшим отличием от обычного прослушивателя событий. Как вы создаете объект, так это вы должны назвать setContainer($serviceContainer), Для этого у вас должен быть сервисный контейнер внутри вашей формы. Чтобы сделать это, вы должны передать его как опцию при создании формы в контроллере.

// in controller
$object = ...;
$form = $this->createForm(new YourFormType(), $object, array('service_container' => $this->get('service_container')));

// in YourFormType
$listener = new EntrarYPreregistroFormSubscriber();
$listener->setContainer($options['service_container']);
$builder->addEventSubscriber($listener);
...
// in setDefaultOptions method
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
...
'service_container' => null,
));
}

active «data-shortcut =» A
самый старый «data-shortcut =» O
голосует «data-shortcut =» V
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector