更新
阅读 Symfony 文档的另一个原因永远不会过时。针对我的具体情况有一个简单的解决方案,就是将field type 选项empty_data 设置为默认值。
同样,此解决方案仅适用于表单中的空输入将 DB 字段设置为 null 的情况。
背景
以前的答案都没有帮助我解决我的具体情况,但我找到了解决方案。
我有一个表单域,它的行为如下:
- 不需要,可以留空。 (使用'必需' => false)
- 如果留空,则应默认为给定值。为了更好的用户体验,我没有在输入字段上设置默认值,而是使用了 html 属性“占位符”,因为它不那么突兀。
然后我尝试了这里给出的所有建议。让我列出它们:
<?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->isValid() 方法中的form->handleRequest() 将覆盖您的Entity 类上的这些默认值,并且将它们设置为输入字段值。如果输入字段值为空,则将Entity 属性设置为null。
http://symfony.com/doc/current/book/forms.html#handling-form-submissions
我的解决方法
在 form->isValid() 方法中的 form->handleRequest() 之后在控制器上设置默认值:
...
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() 方法不使用模型的setter 方法来更新数据(更多细节请深入form->setData())。