如何在表单中插入登录用户?

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 可以胜任。