Symfony2 - при создании формы необходимо пройти авторизованному пользователю

У меня настроена форма ответа для ответов на сообщения.

Я хочу настроить автора так, чтобы он был пользователем, который в данный момент вошел в систему. Сейчас это просто раскрывающееся меню предыдущих авторов, которые уже опубликованы, а это не то, что мне нужно.

Как настроить его для использования текущего имени пользователя в качестве автора вместо списка авторов, уже сохраненного в базе данных?

Есть ли глобальная команда для доступа к текущему пользователю, вошедшему в систему, для перехода к строке ->add('author) в форме?

Форма ReplyType

class ReplyType extends AbstractType
{
/**
 * {@inheritDoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('author')
        ->add('body')
        ->add('post', 'submit');
}

/**
 * {@inheritDoc}
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Acme\DemoBundle\Entity\Reply'
    ));
}

/**
 * {@inheritDoc}
 */
public function getName()
{
    return 'acme_demobundle_reply';
}
}

Ответить сущность

/**
 * @var Author
 *
 * @ORM\ManyToOne(targetEntity="Author", inversedBy="replies")
 * @ORM\JoinColumn(name="author_id", referencedColumnName="id", nullable=false)
 * @Assert\NotBlank
 */
private $author;

person dizzyd    schedule 01.06.2014    source источник


Ответы (1)


Поскольку вошедший в систему пользователь является автором, как насчет удаления поля и установки автора для вошедшего в данный момент пользователя внутри контроллера? Пользователь не должен фактически выбирать автора (например: см. формы ответов или комментариев Stackoverflow.com).

// ...
use Symfony\Component\HttpFoundation\Request;

public function postReplyAction(Request $request)
{
    $reply = new Reply();

    $form = $this->createForm(new ReplyType(), $reply);

    $form->handleRequest($request);

    if ($form->isValid()) {
        // perform your logic and before savig the reply to the database
        $reply->setAuthor($this->getUser());
        // save your reply

        return $this->redirect($this->generateUrl('reply_success'));
    }

    // ...
}

И ваш тип формы становится:

class ReplyType extends AbstractType
{

    /**
     * {@inheritDoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('body')
            ->add('post', 'submit');
    }

    /**
     * {@inheritDoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\DemoBundle\Entity\Reply'
        ));
    }

    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return 'acme_demobundle_reply';
    }

}
person ggioffreda    schedule 01.06.2014
comment
Спасибо за этот блестящий совет, вопрос. У меня есть настройка объекта «Ответ» как «многие к одному» для объекта «Автор». Основываясь на вашем решении, как мне обращаться с этими двумя объектами? Я получаю, что это значение не должно быть пустым, когда я удаляю -›add('author') из моей формы. См. выше объект ответа. - person dizzyd; 01.06.2014
comment
Я удалил связь с ответом и автором и указал автора в качестве строкового значения в ответе. Теперь, когда я пытаюсь сохранить ответ, я получаю следующее: ContextErrorException: Catchable Fatal Error: Object of class Acme\DemoBundle\Entity\User could not be converted to string in /var/www/html/SymChatter/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 120 - person dizzyd; 01.06.2014
comment
получил его, использовал public function __toString(), исправил ошибку и теперь использует $this->getUser() в качестве автора. Спасибо за большую помощь и объяснение, солитер! - person dizzyd; 01.06.2014