Symfony2 - 在实体构造函数中设置默认值

时间:2013-11-30 19:09:05

标签: symfony entity default

我可以设置一个简单的默认值,例如字符串或布尔值,但我找不到如何为实体设置defualt。

在我的User.php实体中:

/**
* @ORM\ManyToOne(targetEntity="Acme\DemoBundle\Entity\Foo")
*/
protected $foo;

在构造函数中,我需要设置$ foo的默认值:

public function __construct()
{
    parent::__construct();

    $this->foo = 1; // set id to 1
}

需要一个Foo对象,这会传递一个整数。

设置默认实体ID的正确方法是什么?

3 个答案:

答案 0 :(得分:10)

我认为你最好将它设置在PrePersist事件中。

User.php

use Doctrine\ORM\Mapping as ORM;

/**
* ..
* @ORM\HasLifecycleCallbacks
*/
class User 
{
         /**
         * @ORM\PrePersist()
         */
        public function setInitialFoo()
        {
             //Setting initial $foo value   
        }

}

但是,设置关系值不是通过设置整数id来实现的,而是通过添加Foo的实例来执行。这可以在事件监听器内完成,而不是实体的LifecycleCallback事件(因为你必须调用Foo实体的存储库)。

首先,在您的软件包services.yml文件中注册该事件:

services:
    user.listener:
        class: Tsk\TestBundle\EventListener\FooSetter
        tags:
            - { name: doctrine.event_listener, event: prePersist }

FooSetter类:

namespace Tsk\TestBundle\EventListener\FooSetter;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Tsk\TestBundle\Entity\User;

class FooSetter
{
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        if ($entity instanceof User) {
            $foo = $entityManager->getRepository("TskTestBundle:Foo")->find(1);
            $entity->addFoo($foo);
        }
    }
}

答案 1 :(得分:2)

在这个简单的例子中,我会远离听众,并将EntityManager传递给实体。

更清洁的方法是将您需要的实体传递到新实体:

class User
{

    public function __construct(YourEntity $entity)
    {
        parent::__construct();

        $this->setFoo($entity);
    }

然后在您创建新实体的其他地方,您需要找到并传递正确的实体:

$foo = [find from entity manager]
new User($foo);

<强> - 额外 -

如果你想更进一步,那么实体的创建可以在服务中:

$user = $this->get('UserCreation')->newUser();

可能是:

function newUser()
{
    $foo = [find from entity manager]
    new User($foo);
}

这是我的首选方式

答案 2 :(得分:0)

你不能只用'Foo'传递关系的id。您需要先检索Foo实体,然后设置foo属性。为此,您需要一个Doctrine Entity Manager实例。但是,你让你的实体依赖于EntityManager,这是你不想要的。

示例:

// .../User.php

public function __construct(EntityManager $em) {
    $this->em = $em;

    $this->foo = $this->em->getRepository('Foo')->find(1);
}