我已经实施了一个选民系统来检查用户是否可以查看他尚未订阅的帖子。我在控制器中的一个动作中调用它。
Environment.UserName
如果选民返回true,则会将其重定向到树枝模板。
如果返回false并且显示“您无权查看此帖子”,则如何呈现相同的模板! ?
编辑得更清楚:我不希望用户通过更改网址中的帖子ID来查看他尚未订阅的帖子。所以,我已经实施选民检查。如果选举人返回true,则呈现twig模板,否则显示的消息不带模板。我希望此消息显示在模板中。
我想在我的树枝模板中使用这样的东西:
$this->denyAccessUnlessGranted('view', $post, 'You do not have permission to
view this post!');
答案 0 :(得分:3)
对于未来,请提供更多背景信息。就像你在哪里叫这个?我在控制器中假设?
我进一步假设它是在控制器的动作中。
从您的评论中得出的下一个假设是,如果用户具有访问权限并且重定向他,则您希望呈现模板。
如果是这种情况,你可以这样做:
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询问如何在树枝中设置post
变量。
我再次在这里假设,所以你可能有一个控制器并使用类似的东西:
return $this->render('view.html.twig', [
'post' => $post,
'foo' => 'bar',
]);
在这种情况下,post
和foo
作为变量传递给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 %}