2013-11-30 4 views
5

Я могу установить простое значение по умолчанию, такое как строка или логическое значение, но я не могу найти, как установить defualt для объекта.Symfony2 - Установить значение по умолчанию в конструкторе сущности

В моей User.php Entity:

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

В конструкторе мне нужно установить значение по умолчанию для $ Foo:

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

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

объект А Foo, как ожидается, и это проходит целое.

Каков правильный способ установить идентификатор объекта по умолчанию?

ответ

8

Я думаю, что вы лучше установить его внутри 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

Это отлично работало. Спасибо за подробный ответ. Я думал, что это будет намного проще, и я не смог бы найти это документально. – hipnosis

+0

@hipnosis Вот официальный учебник по symfony о доктрине http://symfony.com/doc/current/book/doctrine.html. И о событиях http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html. Также вы можете проверить учебные пособия там о создании сайтов с symfony, что-то вроде http://www.intelligentbee.com/blog/tag/symfony2-jobeet/ –

+0

Для потомков использование прослушивателя событий также отделяет класс сущности от любого конкретного ORM (в данном случае Доктрина). Таким образом, если вам когда-либо понадобится перейти на другой ORM/DBAL, объект не нужно будет изменять. Что-то нужно иметь в виду при разработке вашего приложения, как правило. –

0

Вы не можете просто передать идентификатор отношения с 'Foo'. Сначала необходимо восстановить объект Foo, а затем установить свойство foo. Для этого вам понадобится экземпляр Doctrine Entity Manager. Но тогда вы заставляете свою сущность полагаться на EntityManager, это то, чего вы не хотите.

Пример:

// .../User.php 

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

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

Явное делает сущность, зависящая от 'EntityManager', действительно плохая идея. –

+0

Это то, что я думал, должно произойти, но это казалось неправильным. Спасибо за вашу помощь. – hipnosis

2

я бы держаться подальше от слушателей в этом простом примере, а также через пропускные EntityManager в сущность.

Гораздо чище подход передать сущность вам требуется в новые организации:

class User 
{ 

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

     $this->setFoo($entity); 
    } 

Тогда в другом месте, когда вы создаете новый объект, вам нужно будет найти и передать правильный объект в:

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

--Extra--

Если вы хотите, чтобы идти дальше, то создание объекта может быть в службе:

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

, которые могли бы быть:

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

Это будет мой предпочтительный способ

Смежные вопросы