[英]Symfony2 - Set default value in entity constructor
我可以设置一个简单的默认值,如字符串或布尔值,但我找不到如何为实体设置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的正确方法是什么?
我认为你最好把它放在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
实体的存储库)。
首先,在bundle 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);
}
}
}
在这个简单的例子中,我会远离监听器,并且还将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);
}
这将是我的首选方式
你不能只用'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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.