簡體   English   中英

ManyToMany實體關系:使用FOSUserBundle通過當前用戶的值以字段形式設置默認值

[英]ManyToMany entity relation: set a default value in a field form by the value of the current user using FOSUserBundle

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

這次我發生了這個錯誤:

無法轉換屬性路徑“用戶”的值:預期為Doctrine \\ Common \\ Collections \\ Collection對象。

我想你忘了聲明屬性PARCS和用戶作為ArrayCollection中的構造函數,如解釋在這里 嘗試這個 :

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

您在Parcs實體中的setUsers()方法充當獲取器而不是設置器。 由於它是* toMany關系,請將其刪除並添加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);
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM