如何在表单中插入登录用户?
How to insert the logged user in form?
我希望在表单中自动插入登录用户的 ID,我喜欢这样:
/**
* Body
*
* @ORM\Table(name="Body", indexes={@ORM\Index(name="User", columns={"user_id"})})
* @ORM\Entity
*/
class Body
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="datetime", nullable=true)
*/
private $date;
/**
* @var string
*
* @ORM\Column(name="entry", type="string", length=45, nullable=true)
*/
private $entry;
/**
* @var \User
*
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
private $user;
....
}
User.php :
/**
* User
*
* @ORM\Table(name="User")
* @ORM\Entity
*/
class User extends BaseUser {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="first_name", type="string", length=50, nullable=true)
*/
private $firstName;
/**
* @var string
*
* @ORM\Column(name="last_name", type="string", length=50, nullable=true)
*/
private $lastName;
....
}
体型:
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use My\MyBundle\Entity\User;
class BodyType extends AbstractType
{
private $author;
public function __construct( User $author )
{
$this->author = $author;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('date', 'date')
->add('entry', 'text')
->add('User', 'hidden', array('data'=>$this->author))
->add('save', 'submit')
;
}
...
}
和我的行动:
public function CreateAction(Request $request)
{
$body = new Body();
$form = $this->get('form.factory')->create(new BodyType($this->get('security.context')->getToken()->getUser()), $body);
if ($form->handleRequest($request)->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($body);
$em->flush();
}
最后我在提交表单后收到此错误:
Catchable Fatal Error: Argument 1 passed to My\MyBundle\Entity\Body::setUser() must be an instance of My\MyBundle\Entity\User, string given, called in /var/www/project/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php on line 410 and defined
有人有解决办法吗?
您不能使用隐藏字段即时存储引用。您必须:
使用数据转换器帮助您在需要时正确转换值和 return 对象(更多信息请点击此处 Cookbook: How to use Data Transformers
或者,由于您不打算显示该字段,您可以自己简单地设置它,如下所示:
$body = new Body();
$body->setUser( $this->getUser() );
// A shortcut for $this->get('security.context')->getToken()->getUser()
// if your controller extends the one Symfony is providing
我相信选项 2 可以胜任。
我希望在表单中自动插入登录用户的 ID,我喜欢这样:
/**
* Body
*
* @ORM\Table(name="Body", indexes={@ORM\Index(name="User", columns={"user_id"})})
* @ORM\Entity
*/
class Body
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="datetime", nullable=true)
*/
private $date;
/**
* @var string
*
* @ORM\Column(name="entry", type="string", length=45, nullable=true)
*/
private $entry;
/**
* @var \User
*
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
private $user;
....
}
User.php :
/**
* User
*
* @ORM\Table(name="User")
* @ORM\Entity
*/
class User extends BaseUser {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="first_name", type="string", length=50, nullable=true)
*/
private $firstName;
/**
* @var string
*
* @ORM\Column(name="last_name", type="string", length=50, nullable=true)
*/
private $lastName;
....
}
体型:
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use My\MyBundle\Entity\User;
class BodyType extends AbstractType
{
private $author;
public function __construct( User $author )
{
$this->author = $author;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('date', 'date')
->add('entry', 'text')
->add('User', 'hidden', array('data'=>$this->author))
->add('save', 'submit')
;
}
...
}
和我的行动:
public function CreateAction(Request $request)
{
$body = new Body();
$form = $this->get('form.factory')->create(new BodyType($this->get('security.context')->getToken()->getUser()), $body);
if ($form->handleRequest($request)->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($body);
$em->flush();
}
最后我在提交表单后收到此错误:
Catchable Fatal Error: Argument 1 passed to My\MyBundle\Entity\Body::setUser() must be an instance of My\MyBundle\Entity\User, string given, called in /var/www/project/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php on line 410 and defined
有人有解决办法吗?
您不能使用隐藏字段即时存储引用。您必须:
使用数据转换器帮助您在需要时正确转换值和 return 对象(更多信息请点击此处 Cookbook: How to use Data Transformers
或者,由于您不打算显示该字段,您可以自己简单地设置它,如下所示:
$body = new Body();
$body->setUser( $this->getUser() );
// A shortcut for $this->get('security.context')->getToken()->getUser()
// if your controller extends the one Symfony is providing
我相信选项 2 可以胜任。