symfony2 - 为受保护对象增加价值

symfony2 - add value to protected object

如何设置受保护对象用户?填写表格后,我必须使用当前用户数据添加用户对象(例如保存评论)。我试过类似的东西:

  if ($form->isValid()) {
        $comment = $form->getData();
        $comment->user = $this->contextSecurity->getToken()->getUser();
        $this->model->save($comment);
  }

我遇到了这个错误

FatalErrorException: Error: Cannot access protected property AppBundle\Entity\Comment::$user in /home/AppBundle/Controller/CommentsController.php line 184

这是我的评论实体:

class Comment
{
    /**
     * Id.
     *
     * @ORM\Id
     * @ORM\Column(
     *     type="integer",
     *     nullable=false,
     *     options={
     *         "unsigned" = true
     *     }
     * )
     * @ORM\GeneratedValue(strategy="IDENTITY")
     *
     * @var integer $id
     */
    private $id;

    /**
     * Content.
     *
     * @ORM\Column(
     *     name="content",
     *     type="string",
     *     length=250,
     *     nullable=false
     * )
     * @Assert\NotBlank(groups={"c-default"})
     * @Assert\Length(min=3, max=250, groups={"c-default"})
     *
     * @var string $content
     */
    private $content;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="comments")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
     */
    protected $user;

我正在使用 Symfony2.3。任何帮助将不胜感激。

您不能从对象外部修改受保护的属性。为此,您需要一个 public 属性 或 setter。

class Comment
{
    // ...

    public function setUser(User $user)
    {
        $this->user = $user;
    }
}

在控制器中你可以这样写:

$comment->setUser($this->getUser());

这个问题与 Symfony2 无关,首先你应该阅读 php 类型,尤其是对象。 read here and then here

您应该了解 Visibility 的工作原理。之后你就会明白访问对象的 protected/private 属性只能从对象本身获得,所以你需要创建 public 方法

setUser($user) {
    $this->user = $user;
}

我总是使用受保护的,如果我想编辑变量或取值,我使用 getter 和 setter:

public function setUser($user) {
    $this->user = $user;
}

public function getUser(){
   return $this->user;
}