2014-02-17 91 views
2

我有一個擁有訂閱ArrayCollection的用戶實體。我有這些制定者和獲得者。Symfony2表單實體處理

public function addSubscription(\Doge\WowBundle\Entity\Subscription $subscription) 
{ 
    $this->subscriptions[] = $subscription; 
    return $this; 
} 

public function removeSubscription(\Doge\WowBundle\Entity\Subscription $subscription) 
{ 
    $this->subscriptions->removeElement($subscription); 
} 

public function getSubscriptions() 
{ 
    return $this->subscriptions; 
} 

還有另一個名爲Plan的實體。訂閱基本上是用戶和計劃之間的中間實體,但它擁有一個額外字段,因此有必要成爲專用實體。

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="subscriptions") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE") 
*/ 
protected $user; 

/** 
* @ORM\ManyToOne(targetEntity="Plan", inversedBy="subscriptions") 
* @ORM\JoinColumn(name="plan_id", referencedColumnName="id", onDelete="CASCADE") 
*/ 
protected $plan; 

/** 
* @ORM\Column(type="date") 
*/ 
protected $nextDue; 

否則,它只是與生成的自動中間表的多對多關係。

現在在用戶註冊表單,用戶可以使用此代碼在FormBuilder在計劃表中可用的計劃之間進行選擇

$builder->add('subscriptions', 'entity', array('class' => 'DogeWowBundle:Plan')) 

如何創建給出的計劃對象的新認購對象?我會在控制器中這樣做嗎?使用數據變換器?最佳做法是什麼?

回答

1

你有2個選項,第一個是你有一個包含表單的表單。一種形式映射到您的用戶,另一種映射到您的訂閱。因此,在你的用戶基本形成,你將不得不

$builder->add('subscriptions', new SubscriptionsType()) 

和SubscriptionsType內你會有你像計劃實體:

$builder->add('plan', 'entity', array(
    'class' => 'DogeWowBundle:Plan', 
    'property' => 'plan_name', 
)); 

這樣您的訂閱將被自動生成和更新是必要的。

你也可以使用數據轉換器,但我個人喜歡在表單中使用表單。

+0

剩下的問題是「既沒有屬性」訂閱「也沒有方法」setSubscriptions()「,」__set()「或」__call()「之一存在並且在類中具有公共訪問權限。我如何調用addSubscription函數,看到可以有多個? –

+0

其次,訂閱中的其他字段如何通過編程方式不通過表單設置? –

+0

假設你有映射到一個用戶, $形成= $這 - >的CreateForm(新RegistrationType(),$用戶)一個登記表; 用戶已經擁有的任何訂閱將在表單呈現時被選中。那麼當handleRequest被調用時,它會將表單中的所有數據都設置爲實體,因此您必須爲第一種方法實施setSubscriptions()。 –