Обновление
Еще одна причина, по которой читает документацию для Symfony, никогда не выйдет из моды.В моем конкретном случае есть простое решение: установить для параметра field type
empty_data
значение по умолчанию.
Опять же, это решение предназначено только для сценария, в котором пустой ввод в форме устанавливаетПоле БД для null.
Фон
Ни один из предыдущих ответов не помог мне с моим конкретным сценарием, но я нашел решение.
У меня было поле формы, которое нужно было вести себяследующим образом:
- Не требуется, можно оставить пустым.(Используется 'required' => false)
- Если оставить это поле пустым, по умолчанию должно быть задано значение.Для удобства пользователей я не установил значение по умолчанию для поля ввода, а использовал атрибут html 'placeholder', поскольку он менее навязчив.
Затем я попробовал все рекомендации, приведенные здесь.Позвольте мне перечислить их:
- Установить значение по умолчанию, когда для свойства объекта:
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @Column(name="myColumn", type="string", length="50")
*/
private $myColumn = 'myDefaultValue';
...
}
- Использовать аннотацию параметров:
@ORM\Column(name="foo", options={"default":"foo bar"})
- Установите значение по умолчанию для конструктора:
/**
* @Entity
*/
class myEntity {
...
public function __construct()
{
$this->myColumn = 'myDefaultValue';
}
...
}
Ничего из этого не сработало, и все из-за того, как Symfony использует ваш класс Entity.
ВАЖНО
Поля формы Symfony переопределяют значения по умолчанию, установленные в классе Entity. Это означает, что в вашей схеме для вашей БД может быть определено значение по умолчанию, но если вы оставите необязательное полепусто при отправке формы, form->handleRequest()
внутри вашего form->isValid()
метода переопределит эти значения по умолчанию в вашем классе Entity
и установит для них значения поля ввода.Если значения поля ввода не заполнены, для свойства Entity
будет установлено значение null
.
http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Мой обходной путь
Установите значение по умолчанию наваш контроллер после form->handleRequest()
внутри вашего form->isValid()
метода:
...
if ($myEntity->getMyColumn() === null) {
$myEntity->setMyColumn('myDefaultValue');
}
...
Не красивое решение, но оно работает.Я мог бы сделать validation group
, но могут быть люди, которые рассматривают эту проблему как преобразование данных вместо проверки данных , я оставляю вам решать.
Установщик переопределения (не работает)
Я также попытался переопределить установщик Entity
следующим образом:
...
/**
* Set myColumn
*
* @param string $myColumn
*
* @return myEntity
*/
public function setMyColumn($myColumn)
{
$this->myColumn = ($myColumn === null || $myColumn === '') ? 'myDefaultValue' : $myColumn;
return $this;
}
...
Это, даже если он выглядит чище, это не работает .Причина в том, что злой form->handleRequest()
метод не использует методы установки модели для обновления данных (подробнее см. form->setData()
).