Penso che il modo in cui un Sottoscrittore di moduli funziona è leggermente diverso da un normale Listener di eventi.
Nel vostro controller, si sono istanziare il tipo di forma, cioè
$form = $this->createForm(new CustomerType(), $customer);
Dal momento che il contenitore è disponibile nel controller, è possibile passare direttamente al vostro tipo di forma, cioè
$form = $this->createForm(new CustomerType($this->container), $customer);
Nel mio caso avevo bisogno del contesto di sicurezza, quindi la mia implementazione (simile ma leggermente diversa alla tua q originale):
Nel mio controller:
$form = $this->createForm(new CustomerType($this->get('security.context')), $customer));
Nella mia classe 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
}
E nella mia Subscriber Modulo
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
}
}
}
Speranza che aiuta.
fonte
2012-07-02 08:17:19
Beh, non sapevo che gli ascoltatori potessero essere definiti come servizi. In questo momento sto definendo solo tipi di moduli e classi (come servizi). Buono a sapersi! Grazie. – gremo
Giusto, quindi immagino che risponda alla tua domanda? Qualsiasi cosa definita come servizio può avere accesso ad altri servizi (incluso il contenitore del servizio) usando l'iniezione di dipendenza. –
Come ottenerlo in forma, quindi iniettarlo per formare anche tramite DI? – umpirsky