[英]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.