Ich erstelle ein Formular in Symfony2. Das Formular enthält nur ein Feld book
, das dem Benutzer die Auswahl zwischen Books
Entitäten ermöglicht. Ich muss überprüfen, ob der gewählte Book
zu einem Author
gehört, den ich in meinem Controller habe.Übergeben Sie benutzerdefinierte Parameter an benutzerdefinierte ValidationConstraint 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');
}
// ...
}
Ich mag überprüfen, nach dem Absenden des Formulars, dass die ausgewählten Book
durch die $author
in meinem Controller geschrieben:
public class MyController
{
public function doStuffAction() {
$author = ...;
$form = $this->createForm(new MyFormType($author));
$form->bind($this->getRequest());
// ...
}
}
Leider kann ich keine Möglichkeit, das zu tun finden. Ich habe versucht, eine benutzerdefinierte Validator-Einschränkung wie in The Cookbook beschrieben zu erstellen, aber während ich den EntityManager
als Parameter übergeben kann, indem ich den Validator als Dienst definiere, kann ich die $author
vom Controller nicht an die Validator-Einschränkung übergeben.
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 könnte sein, genau die, die ich suchte, aber meine Form ist nicht auf eine Entity gebunden und nicht an seine (von der getData()
Methode Ich erhalte die Daten) gemeint.
Gibt es eine Lösung für mein Problem? Das muss ein häufiger Fall sein, aber ich weiß wirklich nicht, wie ich es lösen soll.
Beachten Sie, dass in Symfony 2.7 der benutzerdefinierte Parameter nicht direkt im $ options-Array gefunden wird, sondern innerhalb eines 'value' Schlüssels. In diesem Beispiel würden Sie den Autor von $ options ['value'] ['author'] erhalten. Und wenn Sie die Assert mit Annotationen deklariert haben, würden Sie etwas schreiben: @CustomAssert \ CustomDateTime ({"dateFormat": Enum :: DATE_FORMAT}) –