在我的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对象。
答案 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);
...