如何在连接用户之后,按照实体之间的ManyToMany关系将默认值设置为symfony表单字段(用户字段)

fre*_*dev 5 forms many-to-many symfony twig fosuserbundle

在我的symfony 2.7应用程序中,我有基于FOSUserBundle的用户实体.必须连接用户才能访问addAction()表单.

我的用户实体与另一个名为parc的实体链接.这是我的两个实体的代码.

Users.php

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

    public function __construct()
    {
        parent::__construct();
        $this->parcs = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * @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;
    }
Run Code Online (Sandbox Code Playgroud)

Parcs.php

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;

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

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

   /**
    * Add user
     *
     * @param \MySpace\MyBundle\Entity\Users $user
     *
     * @return Parcs
     */
    public function addUser(\MySpace\MyBundle\Entity\Users $user)
    {
        $this->users[] = $user;

        return $this;
    }
Run Code Online (Sandbox Code Playgroud)

使用FOSUserBundle,为了访问连接的用户,在我的树枝视图中我做了这个:{{ app.user.username }},它返回当前用户的用户名.

现在,当我想添加parc时,我想以我的symfony形式(对于字段用户)检索此值.这是我的parcsType.php形式:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('parcName')
            ->add('users')
        ;
    }
Run Code Online (Sandbox Code Playgroud)

这是我在树枝视图中的表单:

<form action="{{ path('addParcs_process') }}" method="POST" {{ form_enctype(form) }}>
  <div>
    {{ form_label(form.parcName, "Enter the parc name: ", {'label_attr': {'class': 'control-label'}}) }}
    {{ form_errors(form.parcName) }}
    {{ form_widget(form.parcName) }}
  </div>
  <div>
    {{ form_label(form.users, "Vous ajoutez ce parc en tant que: ", {'label_attr': {'class': 'control-label'}}) }}
    {{ form_errors(form.users) }}
    {{ form_widget(form.users, {'attr': {'value': app.user.username }}) }}
  </div>
  <input type="submit" value="Ajouter" class="btn btn-success"/>
</form>
Run Code Online (Sandbox Code Playgroud)

如您所见,我设置了我的用户字段的默认值{{ app.user.username }},并且它可以工作,我的用户字段返回当前用户.但是当我提交表单时,用户字段和关联(ManyToMany)之间Parcs.phpUsers.php没有持久/刷新.

这是我的控制器代码:

public function addParcsAction() {

    if (!$this->get('security.context')->isGranted('ROLE_EDIT')) {
      throw new HttpException("403");
    }

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

    $form=$this->createForm(new ParcsType(), $parc);
    $form->add('user');
    $request = $this->getRequest();

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

            $form->bind($request);

            $currentUser=$this->container->get('security.context')->getToken()->getUser();
            $parc->setUsers($currentUser);

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

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

    else {
            return $this->render('MySpaceMyBundle:Parcs:addParcs.html.twig', array('form' => $form->createView() ));
         }
}
Run Code Online (Sandbox Code Playgroud)

提交工作正常,当我输入parc name的值时,数据在我的数据库中注册,但不是用户值和ManyToMany关联.

fre*_*dev 3

我找到了解决方案,

正如此处所解释的,只有拥有方负责连接管理。

问题不在于方法$parc->addUser($currentUser);,而只是实体 Parcs 不是在想要持久数据时管理此关系的所有者。

所以我反转了实体所有者属性。关系Parcs.php必须是这样的:

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="Users", inversedBy="parcs")
 * @ORM\JoinTable(name="parcs_users",
 *   joinColumns={
 *     @ORM\JoinColumn(name="parc_id", referencedColumnName="id")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 *   }
 * )
 */
private $users;
Run Code Online (Sandbox Code Playgroud)

Users.php为了写这个,我必须删除关系:

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="Parcs", mappedBy="users")
 */
private $parcs;
Run Code Online (Sandbox Code Playgroud)

这是我的控制器addAction()

public function addParcsAction() {

    if (!$this->get('security.context')->isGranted('ROLE_EDIT')) {
      throw new HttpException("403");
    }

    $em=$this->getDoctrine()->getManager();
    $parc = new Parcs;
    $currentUser = $this->container->get('security.context')->getToken()->getUser();
    $parc->addUser($currentUser);

    $form = $this->createForm(new ParcsType(), $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('indexParc'));
        }

    else {
            return $this->render('MySpaceMyBundle:Parcs:addParcs.html.twig', array('form' => $form->createView() ));
         }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的回答,注意到这里不是 $parc->addUser($currentUser); 谁在闹事,只是老板一方的关系。