2015-04-02 58 views
2

我有2個實體,聯繫人和聯繫人類型。 所有者實體聯繫,具有屬性$類型:如何在屬性中設置默認實體關係?

/** 
* @ORM\ManyToOne(targetEntity="Evo\BackendBundle\Entity\ContactType") 
* @ORM\JoinColumn(nullable=true) 
*/ 
protected $type = null; 

我現在必須設置這種關係是強制性的。我嘗試了以下內容:

/** 
* @ORM\ManyToOne(targetEntity="Evo\BackendBundle\Entity\ContactType") 
* @ORM\JoinColumn(nullable=false) 
*/ 
protected $type = 2; 

但是,我收到一個錯誤,它非常邏輯。我應該設置一個實體(ID爲2)作爲默認值,而不是整數。但我不知道如何做到這一點。我以前讀過,我不應該做任何查詢數據庫或實體內的EntityManager的任何使用。那麼我如何設置一個默認的ContactType?

+0

嘗試withRegistering一個'事件Listeners'和創造你的實體中找到並安裝正確的默認合約類型,以你的實體。希望這可以幫助 – Matteo 2015-04-02 08:27:04

+0

但我必須在任何地方手動觸發事件我創建一個新的聯繫人?因此,使用'$ contact-> setContactType($ em-> getRepository('ContactType') - > find(2));直接在控制器中手動直接手動設置它們幾乎沒有區別:'或者我可以以某種方式自動觸發該事件在聯繫實體,所以我只有一個地方做腳本更新? – VaN 2015-04-02 08:36:21

+0

對不起,我討論的是[doc]對象生命週期管理的[this](http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html)。是的,你也可以在控制器中完成這項工作,只是一種分離邏輯的方法。具體來說,您可以在'prePersist'[doctrine2生命週期](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-events)並在您的對象上添加特定的關係到合約類型。 – Matteo 2015-04-02 08:40:12

回答

1

更好的解決方案可能是將此邏輯放在某種「管理」服務中,例如ContactManager。

<?php 

use Doctrine\ORM\EntityManagerInterface; 

class ContactManager 
{ 
    private $manager; 

    public function __construct(EntityManagerInterface $manager) 
    { 
     $this->manager = $manager; 
    } 

    public function createContact(ContactType $type = null) 
    { 
     if (!$type instanceof ContactType) { 
      $type = $this->manager->getReference('ContactType', 2); 
     } 

     return new Contact($type); 
    } 
} 

然後(在services.yml例如)定義服務:

contact_manager: 
    class: ContactManager 
    arguments: [@doctrine.orm.entity_manager] 
+0

我嘗試了上面給出的事件監聽器解決方案,它工作得很好。爲什麼經理人服務會是更好的解決方案? Symfony文檔似乎推動了事件監聽器,我從未讀過關於管理器服務的任何內容。 – VaN 2015-04-03 07:16:27

相關問題