2015-09-04 119 views
0

在我Symfony的項目,我現在用的是FOSUserBundle多對多實體關係:使用FOSUserBundle

當用戶連接當前用戶的值設置在現場形式的默認值,我可以收集他的信息是這樣:

$user=$this->container->get('security.context')->getToken()->getUser()->getUsername(); 
$user=$this->container->get('security.context')->getToken()->getUser()->getEmail(); 
/* ...etc */ 

這是我的用戶實體:

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

    public function __construct() 
    { 
     parent::__construct(); 
     // your own logic 
    } 

    /** 
    * @var \Doctrine\Common\Collections\Collection 
    * 
    * @ORM\ManyToMany(targetEntity="Parcs", inversedBy="users") 
    * @ORM\JoinTable(name="users_parcs", 
    * joinColumns={ 
    *  @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    * }, 
    * inverseJoinColumns={ 
    *  @ORM\JoinColumn(name="parc_id", referencedColumnName="id") 
    * } 
    *) 
    */ 
    private $parcs; 

    /** 
    * Get parcs 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getParcs() 
    { 
     return $this->parcs; 
    } 

    /** 
    * Set parcs 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function setParcs($parcs) 
    { 
     return $this->parcs; 
    } 

正如你所看到的,我添加其他多對多關係在我的用戶類中,$parcs

這是我的公園實體:

class Parcs 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var \Doctrine\Common\Collections\Collection 
    * 
    * @ORM\ManyToMany(targetEntity="Users", mappedBy="parcs") 
    */ 
    private $users; 

//rest of my entity attributes, object, properties etc 

// getters and setters 

    /** 
    * Get users 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getUsers() 
    { 
     return $this->users; 
    } 

    /** 
    * Set users 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function setUsers($users) 
    { 
     return $this->users; 
    } 

現在在樹枝認爲,只有當用戶連接可以添加一個展區。如果我連接,我可以訪問addingParcAction()。這是我的控制器方法:

public function addParcsAction() { 

    // get the current username 
    $user=$this->container->get('security.context')->getToken()->getUser()->getUsername(); 

    $em=$this->getDoctrine()->getManager(); 
    $parc = new Parcs; 

    $form=$this->createForm(new ParcsType($user), $parc); 

    $request = $this->getRequest(); 

    if ($request->isMethod('POST') | ($form->isValid())) { 

      $form->bind($request); 
      $parc = $form->getData(); 
      $em->persist($parc); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('myView')); 
     } 

    else { 
      return $this->render('MySpaceMyBundle:MyFolder:addParcs.html.twig', array('form' => $form->createView())); 
     } 
} 

除了主體之外,一切正常:沒有數據在我的用戶字段中被保留。實際上,新的parc已經註冊,但我的實體fiedl用戶是空的。

只有一個用戶可以添加parc,但許多用戶可以與此parc關聯(這是在管理視圖中創建的,與此問題無關)。 我怎樣才能persit的關係是這樣的:

我獲取當前用戶,然後當我想補充一個展區,在 實體領域的用戶自動填寫自己的用戶名我被安全回收。上下文方法。


編輯

我也試圖在我的控制器此解決方案:這時候我已經這個錯誤發生

public function addParcsAction() { 

    // get the current username 
    $currentUser=$this->container->get('security.context')->getToken()->getUser()->getUsername(); 

    $em=$this->getDoctrine()->getManager(); 
    $parc = new Parcs; 

    $form=$this->createForm(new ParcsType(), $parc); 
    $form->get('users')->setData($currentUser); 

    $request = $this->getRequest(); 

    if ($request->isMethod('POST') | ($form->isValid())) { 

      $form->bind($request); 
      $parc = $form->getData(); 
      $em->persist($parc); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('myView')); 
     } 

    else { 
      return $this->render('MySpaceMyBundle:MyFolder:addParcs.html.twig', array('form' => $form->createView())); 
     } 
} 

和:

無法轉換值對於屬性路徑「用戶」:預計 Doctrine \ Common \ Col lections \ Collection對象。

回答

1

我想你忘了在構造函數中聲明屬性parcs和用戶爲ArrayCollection,如解釋here。試試這個:

class Users extends BaseUser 
{ 
    ... 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->parcs = new ArrayCollection(); 
     // your own logic 
    } 

和:

class Parcs 
{ 
    ... 

    public function __construct() 
    { 
     $this->users = new ArrayCollection(); 
    } 
+0

的確我忘記了'public function __construct()',但是當我堅持數據的形式時,它什麼也沒有改變,問題仍然是一樣的。 –

+0

在我最初的帖子中看到我的編輯,我嘗試了一些不同的東西。我想我需要用ManyToMany關係進行不同的處理。 –

1

setUsers()在PARCS系統實體的方法作爲一個getter,而不是制定者。由於它是一個*一對多的關係,將其刪除,並添加一個addUser()方法代替:

/** 
* Add user 
* @return Parcs 
*/ 
public function addUser($user) 
{ 
    $this->users[] = $user; 
    return $this; 
} 

然後使用此方法來將用戶添加到該PARCS系統在控制器中。

... 
$currentUser = $this->getUser(); 

$em=$this->getDoctrine()->getManager(); 
$parc = new Parcs(); 
$parc->addUser($currentUser); 

$form=$this->createForm(new ParcsType(), $parc); 
...