ManyToMany实体关系:使用FOSUserBundle通过当前用户的值在字段表单中设置默认值

时间:2015-09-04 12:01:43

标签: php forms symfony doctrine many-to-many

在我的Symfony项目中,我正在使用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中添加了其他 ManyToMany 关系。

这是我的parc实体:

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;
    }

现在在树枝视图中,只有连接用户才能添加parc。如果我已连接,我可以访问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关联(这是在管理视图中进行的,与此问题无关)。 我如何坚持这样的关系:

  

我检索当前用户,然后当我想添加parc时,   实体字段用户自动填充我使用security.context方法检索的用户名。

修改

我也在我的控制器中试过这个解决方案:

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() ));
         }
}

这次我发生了这个错误:

  

无法转换属性路径“users”的值:预期a   Doctrine \ Common \ Collections \ Collection对象。

2 个答案:

答案 0 :(得分:1)

我认为您忘记在构造函数中将属性parcs和用户声明为ArrayCollection,如here所述。试试这个:

class Parcs
{
    ...

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

并且:

     ImageButton excluir = (ImageButton) novaLinha.findViewById(R.id.bt_excluir);
    excluir.setOnClickListener(new ImageButton.OnClickListener(){
                                   @Override
                                   public void onClick(View v) {
                                       novaLinha.setVisibility(viewPai.GONE);
                                   }
                               });

答案 1 :(得分:1)

Parcs实体中的setUsers()方法充当getter而不是setter。由于它是* toMany关系,因此请将其删除并添加addUser()方法:

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

然后使用此方法将用户添加到控制器中的Parc。

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

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

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