Creo que la forma en que funciona un Suscriptor de formulario es un poco diferente de un Oyente de evento regular.
En su controlador, se le instanciar su tipo de forma, es decir
$form = $this->createForm(new CustomerType(), $customer);
Puesto que el recipiente está disponible en el controlador, se puede pasar directamente a su tipo de forma, es decir
$form = $this->createForm(new CustomerType($this->container), $customer);
En mi caso, necesitaba el contexto de seguridad, por lo que mi implementación (similar pero ligeramente diferente a su q original):
En mi controlador:
$form = $this->createForm(new CustomerType($this->get('security.context')), $customer));
En mi clase Form:
use Symfony\Component\Security\Core\SecurityContext;
class CustomerType extends AbstractType
{
protected $securityContext;
public function __construct(SecurityContext $securityContext)
{
$this->securityContext = $securityContext;
}
public function buildForm(FormBuilder $builder, array $options)
{
// Delegate responsibility for creating a particular field to EventSubscriber
$subscriber = new CustomerAddSpecialFieldSubscriber($builder->getFormFactory(), $this->securityContext);
$builder->addEventSubscriber($subscriber);
$builder->add(... the rest of my fields ...);
}
// other standard Form functions
}
Y en mi Formulario de abonado
use Symfony\Component\Security\Core\SecurityContext;
CustomerAddSpecialFieldSubscriber
{
private $factory;
protected $securityContext;
public function __construct(FormFactoryInterface $factory, SecurityContext $securityContext)
{
$this->factory = $factory;
$this->securityContext = $securityContext;
}
public static function getSubscribedEvents()
{
return array(FormEvents::PRE_SET_DATA => 'preSetData');
}
public function preSetData(DataEvent $event)
{
if (true === $this->securityContext->isGranted('ROLE_ADMIN')) {
// etc
}
}
}
espero que ayude.
Bueno, no sabía que los oyentes podrían definirse como servicio. En este momento estoy definiendo solo tipos de formularios y clases (como servicios). ¡Bueno saber! Gracias. – gremo
Correcto, ¿así que supongo que eso responde a su pregunta? Todo lo que se define como un servicio puede tener acceso a otros servicios (incluido el contenedor de servicios) mediante la inyección de dependencia. –
¿Cómo ponerlo en forma luego, inyectarlo para formar a través de DI también? – umpirsky