Sto creando un modulo in Symfony2. Il modulo contiene solo un campo book
che consente all'utente di scegliere tra un elenco di entità Books
. Devo controllare se lo Book
selezionato appartiene a un Author
che ho nel mio controller.Passa i parametri personalizzati a ValidationConstraint personalizzato in Symfony2
public class MyFormType extends AbstractType
{
protected $author;
public function __construct(Author $author) {
$this->author = $author;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('book', 'entity', array('class' => 'AcmeDemoBundle:Book', 'field' => 'title');
}
// ...
}
voglio verificare, dopo l'invio del modulo, che la Book
selezionato è scritto dal $author
nel mio controller:
public class MyController
{
public function doStuffAction() {
$author = ...;
$form = $this->createForm(new MyFormType($author));
$form->bind($this->getRequest());
// ...
}
}
Purtroppo, non riesco a trovare un modo per farlo. Ho provato a creare un vincolo di convalida personalizzato come spiegato in The Cookbook, ma mentre posso passare il parametro EntityManager
definendo il validatore come un servizio, non posso passare il $author
dal controller al vincolo del validatore.
class HasValidAuthorConstraintValidator extends ConstraintValidator
{
private $entityManager;
public function __construct(EntityManager $entityManager) {
$this->entityManager = $entityManager;
}
public function validate($value, Constraint $constraint) {
$book = $this->entityManager->getRepository('book')->findOneById($value);
$author = ...; // That's the data I'm missing
if(!$book->belongsTo($author))
{
$this->context->addViolation(...);
}
}
}
This solution potrebbe essere esattamente quello che stavo cercando, ma la mia forma non è vincolata ad un soggetto e non è destinata ad essere (sto ottenendo i dati dal metodo getData()
).
C'è una soluzione al mio problema? Questo deve essere un caso comune, ma non so davvero come risolverlo.
Si noti che in Symfony 2.7, il parametro personalizzato non si trova direttamente nell'array $ options, ma si trova all'interno di una chiave 'value'. Quindi per questo esempio, otterresti l'autore da $ options ['value'] ['author']. E se hai dichiarato l'affermazione usando annotazioni, avresti scritto qualcosa come: @ CustomSendert \ CustomDateTime ({"dateFormat": Enum :: DATE_FORMAT}) –