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