2015-09-04 121 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); 
...