@RomanGorbatko
PHP, Python, NodeJS, Swift

Как правильно сделать связь many-to-many в Symfony?

Есть две сущности News и User.
При обновлении первой, в поле author нужно указать ID текущего пользователя.
Делаю этот так:
->add('author', 'hidden', array('data' => $this->securityContext->getToken()->getUser()->getId()))


Описание поля author в News сущности:
/**
     * @var $newsCategory
     *
     * @ORM\ManyToOne(targetEntity="\Sector\UserBundle\Entity\User", inversedBy="id")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="author", referencedColumnName="id")
     * })
     * })
     * @Assert\NotBlank
     */
    private $author;

    /**
     * Set author
     *
     * @param \Sector\UserBundle\Entity\User $author
     */
    public function setAuthor(\Sector\UserBundle\Entity\User $author)
    {
        $this->author = $author;
    }

    /**
     * Get author
     *
     * @return \Sector\UserBundle\Entity\User
     */
    public function getAuthor()
    {
        return $this->author;
    }


Но, при обновлении формы, вылетает ошибка:
ContextErrorException: Catchable Fatal Error: Argument 1 passed to Sector\ArticlesBundle\Entity\News::setAuthor() must be an instance of Sector\UserBundle\Entity\User, string given, called in /Users/roman/Development/Sites/Sector.dev/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php on line 377 and defined in /Users/roman/Development/Sites/Sector.dev/src/Sector/ArticlesBundle/Entity/News.php line 341


Я проверил, в Sector\ArticlesBundle\Entity\News::setAuthor() приходи ID юзера, но, как я понимаю, должен приходить объект.

Подскажите, пожалуйста, в чем проблема? Где я упустил?
Спасибо!
  • Вопрос задан
  • 4263 просмотра
Пригласить эксперта
Ответы на вопрос 2
@spolischook
А как ты создаешь форму? В контроллере обычно создатеся вот так:
$news = new News();
$news->setUser($this->getUser());
$form = $this->createForm(new NewsType(), $news);


Таким образом всегда будет текущий юзер засечен и нельзя его будет подменить как в случае с айдишкой в скрытом поле (это к стати секьюрити ишью так делать).
Ответ написан
HelsinG
@HelsinG
Web dev
Если выводить поле для выбора пользователя не нужно, я бы убрал из формы вообще пользователя. И повесил на создание новости, установку пользователя. Например на prePersist
Вот список событий.
doctrine-orm.readthedocs.org/en/latest/reference/e...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы