Symfony/FOSUserBundle: 如何仅在访问者登录后才在文章上显示评论表单?

Symfony/FOSUserBundle: How do I display a comment form on an article only if the visitor is logged in?

我有 3 个实体:用户(FOSUserBundle 的一部分)、评论、文章。

我只想在访问者登录后显示文章的评论表。它显示给每个人都很好。

我的代码不起作用,而且似乎也是一种非常糟糕的做法。我收到 "Variable " 表格“不存在”。因为我正在阻止表单传递给视图。如果我在视图中放置 if 是否有必要?我将不胜感激关于如何完成此任务的任何建议!

非常感谢。

我的comment.html.twig

{% extends 'base.html.twig' %}


{% block body %}
    {% form_theme form 'form/fields.html.twig' %}
    {% if is_granted('ROLE_USER') -%}
        <div class="form-group">{{ form_start(form) }}</div>
        <div class="form-group">{{ form_row(form.comment.title) }}</div>
        <div class="form-group">{{ form_row(form.comment.rating) }}</div>
        <div class="form-group">{{ form_row(form.comment.comment) }}</div>
        <div class="form-group">{{ form_row(form.comment.user.firstName) }}</div>
        <div class="form-group">{{ form_row(form.comment.user.lastName) }}</div>
        <div class="form-group">{{ form_row(form.comment.user.email) }}</div>

        <input class="btn btn-default" type="submit" value="Create" />
    {{ form_end(form) }}

    {% else %}
        <p>Please log in to post a comment!</p>
    {% endif %}

{% endblock %}

我的show.html.twig(文章)

{% extends 'base.html.twig' %}
{% block body_id 'articlepage' %}
{% block body %}

<h1>Article: {{ article.name }}</h1>

<div class="well"><div class="media">
    <div class="media-left media-top">
        <img class="media-object" src="{{ article.thumbnail }}">
    </div>
    <div class="media-body">

        <h4 class="media-heading">{{ article.name }}</h4>
        <p>{{ article.description }}</p>
    </div>
</div></div>




<h2>Article Comments:</h2>

{{ render(controller('AppBundle:Comment:index', {'article_id': article.id})) }}

<h2>Submit a new comment:</h2>
{{ render(controller('AppBundle:Article:comment', {'id': article.id})) }}

{% endblock %}

ArticleController.php 中的 commentAction(嵌入 show.html.twig 中的控制器)

public function commentAction(Request $request, Article $article)
{
    $auth_checker = $this->get('security.userization_checker');
    $token = $this->get('security.token_storage')->getToken();
    $user = $token->getUser();
    $isRoleUser = $auth_checker->isGranted('ROLE_USER');

    if($isRoleUser){
        $comment = new Comment();
        //Build the comment form. 

        $commentForm = $this->createFormBuilder($comment)
            ->add('comment', CommentType::class, array("label" => FALSE))
            ->setAction($this->generateUrl('article_comment', array('id' =>$article->getId())))
            ->getForm();

        $commentForm->handleRequest($request);

        if ($commentForm->isSubmitted() && $commentForm->isValid()) {

            //Update existing user or create new
            $em = $this->getDoctrine()->getManager();
            $comment = $commentForm->getData()->getComment();
            $user = $this->getUser($comment->getUser());

            //Update the existing comment or get a new one
            $user = $this->getUser($comment->getUser());
            $comment = $this->getComment($user, $article, $comment);

            //Set the user and article for the comment.
            $comment->setUser($user);
            $comment->setArticle($article);

            $em->persist($comment);
            $em->flush($comment);

            $this->getDoctrine()->getManager()->flush();
            return $this->redirectToRoute('article_show', array('id' => $article->getId()));
        }

        return $this->render('article/comment.html.twig', array(
            'form' => $commentForm->createView(),
        ));
    } else {
        return $this->render('article/comment.html.twig');
    }
}

如果你想在你的 Twig 模板中检查用户是否登录,你可以使用 app.user 变量:

{% if app.user %}
    {{ render(controller('AppBundle:Comment:index', {'article_id': article.id})) }}
{% endif %}