设置 Symfony 对象默认值的最佳方法是什么?

What is the best way to set defaults values of a Symfony object?

我实际上是在学习 Symfony3,当我设置对象字段的默认值时,我发现我无法按照从教程 I 中学到的常用方法将 DateTime 对象设置为默认值正在关注(参见以下代码)。

<?php    
namespace UTM\UsersBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * User
 *
 * @ORM\Table(name="utm_users", uniqueConstraints={@ORM\UniqueConstraint(name="uuid", columns={"uuid"}), @ORM\UniqueConstraint(name="username", columns={"username"})}, indexes={@ORM\Index(name="group_id", columns={"group_id"})})
 * @ORM\Entity
 */
class User
{

    //...

    private $var = 'value';

    //...

}

所以我寻找了一个解决方案,我发现我可以使用构造函数来实现这一点,所以我完成了以下代码。

<?php    
namespace UTM\UsersBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * User
 *
 * @ORM\Table(name="utm_users", uniqueConstraints={@ORM\UniqueConstraint(name="uuid", columns={"uuid"}), @ORM\UniqueConstraint(name="username", columns={"username"})}, indexes={@ORM\Index(name="group_id", columns={"group_id"})})
 * @ORM\Entity
 */
class User
{

    //...

    private $var;

    //...

    public function __construct() {
        $this->setVar(new DateTime('0000-00-01 00:00:00'));
    }

    //...

}

但现在我想知道设置对象默认值的最佳方法是什么。是只使用 __construct 函数更好还是混合使用这两种方法更好。

感谢您的阅读,希望有人能为我提供这个问题的答案。

我会说在 __construct 中定义默认值更好,因为您会在一个地方看到所有默认值(尤其是当您有很多属性时)并且您可以分配对象,而不仅仅是标量值。

namespace UTM\UsersBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

class User
{

    //...

    private $created;


    private $enabled;

    //...

    public function __construct() {
        $this->created = new \DateTime();
        $this->enabled = true;
    }

    //...

}

如果可能的话,我建议您为属性设置默认值。如果没有,请使用构造函数。请记住,在某些情况下可以省略 ORM 构造函数。 另外,不要忘记为列声明设置注释

<?php
/**
 * @Entity
 */
class City {
    /**
     * @var string
     *
     * @Column(type="string", length="50", options={"default" : "Washington DC"})
     */
    private $name = 'Washington DC';
    ...
}