如何在原则2中设置默认值?


当前回答

虽然在构造函数中设置值可以工作,但使用Doctrine Lifecycle事件可能是更好的解决方案。

通过利用prePersist生命周期事件,您可以仅在初始持久化时为您的实体设置默认值。

其他回答

你也可以使用xml:

<field name="acmeOne" type="string" column="acmeOne" length="36">
    <options>
        <option name="comment">Your SQL field comment goes here.</option>
        <option name="default">Default Value</option>
    </options>
</field>

使用:

options={"default":"foo bar"}

而不是:

options={"default"="foo bar"}

例如:

/**
* @ORM\Column(name="foo", type="smallint", options={"default":0})
*/
private $foo
<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @ORM\Column(name="myColumn", type="integer", options={"default" : 0})
     */
    private $myColumn;
    ...
}

注意,这里使用的是SQL DEFAULT,而某些字段(如BLOB和TEXT)不支持SQL DEFAULT。

在实体中设置一个构造函数,并在那里设置默认值。

更新

阅读Symfony文档永远不会过时的另一个原因是。对于我的特定情况,有一个简单的解决方案,就是将字段类型选项empty_data设置为默认值。

同样,此解决方案仅适用于表单中的空输入将DB字段设置为null的场景。

背景

前面的答案对我的具体情况没有任何帮助,但我找到了一个解决方案。

我有一个表单字段,需要表现如下:

不是必需的,可以留空。(使用'required' => false) 如果为空,则默认为给定值。为了更好的用户体验,我没有在输入字段上设置默认值,而是使用html属性“占位符”,因为它不那么突兀。

然后我尝试了这里给出的所有建议。让我列出它们:

为entity属性设置默认值:

<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @Column(name="myColumn", type="string", length="50")
     */
    private $myColumn = 'myDefaultValue';
    ...
}

使用options注释:

@ORM\Column(name="foo", options={"default":"foo bar"})

在构造函数上设置默认值:

/**
 * @Entity
 */
class myEntity {
    ...
    public function __construct()
    {
        $this->myColumn = 'myDefaultValue';
    }
    ...
}
None of it worked and all because of how Symfony uses your Entity class.

重要的

Symfony表单字段覆盖在Entity类上设置的默认值。 这意味着,您的数据库模式可以定义一个默认值,但如果您在提交表单时留下一个非必需字段为空,那么form->handleRequest()在您的form->isValid()方法将覆盖您的Entity类上的这些默认值,并将它们设置为输入字段值。如果输入字段值为空,则将Entity属性设置为空。

http://symfony.com/doc/current/book/forms.html#handling-form-submissions

我的解决方案

在你的form->handleRequest()后在你的form->isValid()方法上设置默认值:

...
if ($myEntity->getMyColumn() === null) {
    $myEntity->setMyColumn('myDefaultValue');
}
...

这不是一个漂亮的解决方案,但很有效。我可能会建立一个验证组,但可能有人认为这个问题是数据转换,而不是数据验证,我把它留给你来决定。


覆盖设置器(不工作)

我还尝试以这种方式覆盖实体setter:

...
/**
 * Set myColumn
 *
 * @param string $myColumn
 *
 * @return myEntity
 */
public function setMyColumn($myColumn)
{
    $this->myColumn = ($myColumn === null || $myColumn === '') ? 'myDefaultValue' : $myColumn;

    return $this;
}
...

这个,虽然看起来更干净,但它不起作用。原因是邪恶的form->handleRequest()方法没有使用Model的setter方法来更新数据(深入form->setData()了解更多细节)。