Twig中的Symfony投票器

3

我已经实现了一个投票者系统,用于检查用户是否能够查看他未订阅的帖子。我正在控制器中的一个操作中调用它。

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

如果投票者返回true,它将被重定向到一个twig模板。
如果返回false,我该如何渲染相同的模板,并显示消息“您没有查看此帖子的权限!”?
编辑后更清晰:我不想让用户通过更改url中的帖子id查看他未订阅的帖子。因此,我已经实现了投票者来检查。如果投票者返回true,则呈现twig模板,否则显示消息但不使用模板。我希望在模板中显示这个消息。
我想在我的twig模板中使用类似于这样的东西:
{% if is_granted('view', post) %}
    post
{% else %}
    Permission denied
{% endif %}

1
你能提供更多的上下文吗? - Nico Haase
我不希望用户通过更改URL中的帖子ID来查看他未订阅的帖子。因此,我已经实现了投票者来进行检查。如果投票者返回true,则呈现twig模板,否则将显示没有模板的消息。我希望这条消息能够在模板中显示。我希望你现在清楚了。 - jeevan
你可能想要查看文档中的这个示例。 - DarkBee
输出字符串的问题出在哪里?我不知道你的投票系统是如何工作的,也不知道为什么它无法显示给定的字符串。 - Nico Haase
@NicoHaase denyAccessUnlessGranted 指向一个控制器,如果基于投票者拒绝访问,则会抛出一个带有第三个参数“message”的异常。如果没有异常处理程序,则 Symfony 将处理此异常。 - wawa
1个回答

8

为了以后,请提供更多的上下文信息。比如你是在哪里调用这个函数?我猜测是在控制器中吧?

我进一步猜测,你想在控制器的某个动作中使用它。

从你的评论中推断出来的下一个假设是,如果用户有访问权限,你想呈现模板,否则就重定向他。

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

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文档中找到教程。


编辑2: 根据用户输入

您应该能够在twig中直接使用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问如何在twig中设置post变量。我再次做出假设,所以你可能有一个控制器,并使用类似以下的内容:
return $this->render('view.html.twig', [
    'post' => $post,
    'foo' => 'bar',
]);

在这种情况下,postfoo 作为变量传递给 twig。如果您有多个 Post 条目,比如在 $posts 中使用类似以下的内容:
return $this->render('view.html.twig', [
    'posts' => $posts,
]);

在twig文件中,你可以使用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 %}

我建议您阅读有关模板的章节。


你的所有假设都是正确的。根据你的说法,如果权限被拒绝,我需要重定向到另一个页面。然而,我想在同一模板中使用类似以下代码将权限消息打印出来: {% if is_granted('view', post) %} post {% else %} 权限被拒绝 {% endif %} - jeevan
谢谢您的回答。另外,请告诉我如何在Twig中设置这个“post”变量。由于这个变量,我遇到了问题。 - jeevan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接