Tworzę formularz w Symfony2. Formularz zawiera tylko jedno pole book
, które umożliwia użytkownikowi wybór między listą podmiotów Books
. Muszę sprawdzić, czy wybrany Book
należy do Author
Mam w moim kontrolerze.Przekaż parametry niestandardowe do niestandardowej metody sprawdzania poprawności w 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');
}
// ...
}
Chcę sprawdzić, po wysłaniu formularza, że wybrany Book
jest napisany przez $author
w moim kontrolera:
public class MyController
{
public function doStuffAction() {
$author = ...;
$form = $this->createForm(new MyFormType($author));
$form->bind($this->getRequest());
// ...
}
}
Niestety, nie mogę znaleźć jakiś sposób, aby to zrobić. Próbowałem utworzyć niestandardowe ograniczenie weryfikatora, jak wyjaśniono w The Cookbook, ale podczas gdy mogę przekazać EntityManager
jako parametr, definiując walidator jako usługa, nie mogę przekazać $author
z kontrolera do ograniczenia weryfikatora.
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 może być dokładnie taka, która szukałem, ale moja forma nie jest zobowiązany do jednostki i nie ma być (Dostaję danych z metody getData()
).
Czy istnieje rozwiązanie mojego problemu? To musi być powszechny przypadek, ale naprawdę nie wiem, jak go rozwiązać.
Należy zauważyć, że w Symfony 2.7 parametr niestandardowy nie znajduje się bezpośrednio w tablicy $ options, ale znajduje się w kluczu "wartości". W tym przykładzie otrzymasz autora od $ options ['value'] ['author']. A jeśli zadeklarowałeś assert przy użyciu adnotacji, możesz napisać coś w stylu: @CustomAssert \ CustomDateTime ({"dateFormat": Enum :: DATE_FORMAT}) –