代码之家  ›  专栏  ›  技术社区  ›  jeevan

小枝中的Symfony投票者

  •  3
  • jeevan  · 技术社区  · 6 年前

    我已经实现了一个投票系统来检查用户是否可以查看他尚未订阅的帖子。我在控制器中的操作中调用此。

    $this->denyAccessUnlessGranted('view', $post, 'You do not have permission to 
    view this post!');    
    

    如果投票者返回true,它将重定向到细枝模板。

    如果同一模板返回false并显示消息“您无权查看此帖子!”,我如何呈现该模板?

    编辑得更清楚:我不希望用户通过更改url中的帖子id来查看他尚未订阅的帖子。所以,我实施了选民检查。如果投票者返回true,将呈现细枝模板,否则将显示不带模板的消息。我希望此消息显示在模板中。

    我想在我的小树枝模板中使用如下内容:

    {% if is_granted('view', post) %}
        post
    {% else %}
        Permission denied
    {% endif %}
    
    1 回复  |  直到 6 年前
        1
  •  8
  •   wawa    6 年前

    对于未来,请提供更多的背景。你把这个叫什么?我假设是控制器?

    我进一步假设这是一个控制器的动作。

    从您的评论中得出的下一个假设是,如果用户具有访问权限,您希望呈现模板,否则会重定向他。

    如果是这种情况,您可以这样做:

    public function fooAction()
    {
        // if it's not in a controller, but you have a container at $container
        // you can call $container->get('security.authorization_checker')->isGranted('view', $post);
        if (!$this->isGranted('view', $post)) {
            return $this->redirect('https://example.com/denied');
            // or if you have a route let's call it "app_denied"
            //return $this->redirectToRoute('app_denied', ['param' => 'value', 'param2' => 'baz']);
        }
    
        // replace `view.html.twig` with your template
        return $this->render('view.html.twig', [
            'post' => $post,
        ]);
    }
    

    编辑: 如果希望引发异常,请查看自定义错误页。您可以在 Symfony Documentation


    编辑2:基于OP输入

    你可以使用 is_granted 在树枝上。

    您可以这样做:

    {% if is_granted('view', post) %}
        Show the post here
    {% else %}
        Sorry you don't have permissions to access this!
    {% endif %}
    

    你唯一需要注意的是 post 变量已设置。

    如果只想在某人没有访问权限时显示消息,可以使用:

    {% if not is_granted('view', post) %}
        Sorry you don't have permissions to access this!
    {% endif %}
    

    编辑3:OP询问如何设置 邮递 细枝中的变量。 我在这里再次假设,因此您可能有一个控制器,并使用类似的东西:

    return $this->render('view.html.twig', [
        'post' => $post,
        'foo' => 'bar',
    ]);
    

    在这种情况下 邮递 foo 作为变量传递给twig。 如果您有多个 Post 条目,比如 $posts 使用类似

    return $this->render('view.html.twig', [
        'posts' => $posts,
    ]);
    

    在细枝文件中,可以使用 for

    {% for post in posts %}
        {% if is_granted('view', post) %}
            Jup, show the post
        {% else %}
            Nope, don't show it
        {% endif %}
    {% else %}
        There are no posts
    {% endif %}
    

    我建议你阅读 the chapter about Templating