symfony2 - добавить ценность к защищенному объекту

Как настроить пользователя защищенного объекта? После заполнения формы я должен добавить объект пользователя с текущими данными пользователя (например, как сохранение комментариев). Я попробовал что-то подобное:

  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. Любая помощь будет оценена.

3 ответа

Решение

Вы не можете изменять защищенные свойства снаружи объекта. Вам нужна публичная собственность или сеттер для этого.

class Comment
{
    // ...

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

И в контроллере вы можете написать:

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

Этот вопрос не имеет отношения к Symfony2, сначала вы должны прочитать о типах php, особенно об объектах. читай здесь и потом здесь

Вы должны понимать, как работает видимость. После этого вы поймете, что доступ к защищенным / закрытым свойствам объекта доступен только из самого объекта, поэтому вам нужно создать публичный метод

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

Я всегда использую защищенный. Если я хочу изменить переменную или принять значение, я использую метод получения и установки:

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

public function getUser(){
   return $this->user;
}
Другие вопросы по тегам