我正在使用Sonata Admin Bundle,我遇到了一些问题:
function configureRoutes(RouteCollection $collection){ }
如果我写一个简单的函数,该函数可以正常工作:
$collection->remove('create');
但是我要做的就是根据用户连接的角色删除一些路由,所以我试过了:
$seguridad = $this->getConfigurationPool()->getContainer()->get('security.context');
if ($seguridad->getToken()->getUser() != "anon."){
if ( !$seguridad->isGranted('ROLE_ADMIN') ) {
$collection->remove('create');
}
}
但是以管理员身份登录我收到错误: 在呈现模板期间抛出异常(“Route”admin_sademer_core_MIENTITY_create“不存在。”)在SonataAdminBundle:Block:block_admin_list.html.twig第31行。
就像在某个时刻索纳塔在进入仪表板之前删除创建我的路线,然后当我进入仪表板时,我尝试进入路线创建,但路线已被删除。但我不确定发生了什么。
有什么想法吗?非常感谢!
答案 0 :(得分:0)
这可能是因为你的路线被缓存了,试试这个:
$seguridad = $this->getConfigurationPool()->getContainer()->get('security.context');
if ($seguridad->getToken()->getUser() != "anon."){
if ( !$seguridad->isGranted('ROLE_ADMIN') ) {
$collection->remove('create');
} else {
$collection->add('create');
}
}
答案 1 :(得分:0)
我只是采用了不同的方式,只是在entitAdmin.php文件中覆盖了isGranted()。然后,您可以根据用户角色检查权限。但它符合我们的目的。如果我们想使用$ collection-> remove(' create'),我们无法做到这一点,因为无法调用该方法(" configureRoutes()")在应用程序运行时。只在缓存创建时调用该方法(" configureRoutes()")。
/**
* {@inheritdoc}
*/
public function isGranted($name, $object = null)
{
$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
switch ($name) {
case "CREATE":
if (!$user->hasRole("ROLE_ADMIN")) {
return false;
}
default:
return true;
}
}