Форма Symfony2 недействительна, но сущность в любом случае сохраняется?

Я не мог найти решение для моей текущей проблемы в сети.

Я получил формуляр и сущность.
Если формула неверна ($ form-> isValid () возвращает false), сущность в любом случае сохраняется с неверными данными. Я вижу ошибки формы, и это правильно. Но моя сущность не должна обновляться, если форма недействительна. Что здесь не так?
Моя сущность получила полные руки и отношение «многие ко многим» с дополнительными полями.

Я могу показать вам некоторые части кода:

$entry = $em->getRepository('MyAppBundle:Entry')->find($id);

// ...

$form = $this->createForm(new EntryType($this->getUser(), $entry), $entry);

$request = $this->getRequest();

if ($request->getMethod() == 'POST') {

$form->bind($request);

// ...

// i set custom errors here by myself!

if ($entry->getDeadlineEnable() && NULL === $entry->getDeadlineAt()) {
$form->get('deadline_at')->addError(new FormError('Please enter a date.'));
}

// ...

if ($form->isValid()) {

$em->merge($entry);
$em->flush();

// ...

return $this->redirect($this->generateUrl('MyAppBundle_homepage'));

Как видите, я проверяю форму с помощью isValid, которая работает правильно. Он возвращает ложь, если есть ошибка формы, например,

$form->get('deadline_at')->addError(new FormError('Please enter a date.'));

Но право в любом случае обновляется именно здесь, в этой строке:

if ($form->isValid()) {

Почему это?
Это действительно плохая проблема здесь. Я не знаю, почему это происходит.

Спасибо за любой совет.


РЕДАКТИРОВАТЬ:

Дополнительная информация:

Я использую валидаторы тоже для всех полей с простыми условиями.
Я делаю это в EntryType.php @ публичной функции buildForm (FormBuilderInterface $ builder, array $ options), например:

$builder->add('min_commitments', null, array(
'label' => 'Zusagen mindestens',
'attr' => array(
'class' => 'form-control',
'placeholder' => 'Ab wievielen findet\'s statt?',
'min' => 0,
'max' => 100,
),
'required' => false,
'invalid_message' => 'Das ist keine gütige Angabe.',
'constraints' => array(
new Range(array(
'minMessage' => 'Mindestens 1.',
'maxMessage' => 'Maximal 100.',
'min' => 1,
'max' => 100,
)),
),
));

Это числовое поле для ввода числа от 1 до 100.
Но для некоторых полей я использую свою собственную директиву проверки в методе действия контроллера, потому что поля (большинство из них являются комбинацией поля флажка и текстового поля, принадлежащего этому флажку), потому что многие поля взаимозависимы.

Я до сих пор не знаю, что не так с isValid и почему сущность, стоящая за этой формой, сохраняется, даже если форма не полностью действительна. isValid возвращает false там, если существует ошибка (исправить).

Может ли это быть вызвано отношением «многие ко многим»?
Я реализую такие отношения, чтобы позволить пользователю выбрать много флажков, где каждый флажок представляет пользователя. Строки отношений сохраняются в таблице отношений EntryUser.
Вот поле «многие ко многим» в определении формы (Entry.php):

/**
* @ORM\OneToMany(targetEntity="EntryUser", mappedBy="entry", cascade={"all"}, orphanRemoval=true)
*/
protected $entry_users; // One more thing: this is a one to many but it is a many to many relationship at all because i created a relationship table with extra fields so it bacame a own entity. on the other side, the file User.php got the oppsite part of the many-to-many relationship with:

User.php:

/**
* @ORM\OneToMany(targetEntity="EntryUser" , mappedBy="user" , cascade={"all"} , orphanRemoval=true)
*/
protected $entry_users;

0

Решение

Form-> bind — это то, что фактически обновляет сущность с помощью
данные независимо от достоверности данных. Вы должны иметь еще один флеш
быть выгнанным где-то. Возможно, слушатель? Нормальный рабочий процесс для
$ form-> isValid () === false для повторного отображения формы с недействительным
данные и сообщения об ошибках. Еще раз, казалось бы, у вас есть
что-то вызывающее $ em-> flush.-
Кредит @Cerad

2

Другие решения

Вы когда-нибудь пробовали валидаторы? http://symfony.com/doc/current/book/validation.html

Если ваш прикрепленный код от вашего контроллера — проблема в том, что ваше состояние не так.

if ($entry->getDeadlineEnable() && NULL === $entry->getDeadlineAt()) {
$form->get('deadline_at')->addError(new FormError('Please enter a date.'));
}

Контроллер не лучшее место для валидации. Как вы собираетесь повторно использовать валидатор для формы?

1

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×