我在尝试使用QueryBuilder或DQL时遇到问题.
我有以下关系:
用户<-1:n-> Profile <-n:m-> RouteGroup <-1:n-> Route
我想创建一个DQL,列出特定用户有权访问的所有路由.我可以使用以下代码获取此信息:
$usr = $this->container->get('security.context')->getToken()->getUser();
foreach ($usr->getProfiles() as $profile){
foreach ($profile->getRoutegroups() as $routegroup){
var_dump($routegroup->getRoutes()->toArray());
}
}
Run Code Online (Sandbox Code Playgroud)
由于显而易见的原因,我无法使用此代码,否则我将重载我的服务器,大声笑.
我尝试了以下方法:
DQL:
$em->createQuery('SELECT p FROM CRMCoreBundle:User u
JOIN CRMCoreBundle:Profile p
JOIN CRMCoreBundle:RoleGroup rg
JOIN CRMCoreBundle:Role r
WHERE
u.id=:user')
->setParameter('user', $user->getId())
->getResult();
Run Code Online (Sandbox Code Playgroud)
QueryBuilder(我尝试使用u.profiles - 关系的名称而不是实体 - 但这也不起作用):
$em->createQueryBuilder()
->select('r')
->from('CRMCoreBundle:User', 'u')
->innerJoin('u.profiles','p')
->where('u.id = :user_id')
->setParameter('user_id', $user->getId())
->getQuery()
->getResult();
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗???
更新:我尝试了Zeljko的解决方案并制作了这个脚本:
return $this->getEntityManager()
->createQueryBuilder()
->select('u, r')
->from('CRMCoreBundle:User', 'u')
->innerJoin('u.profiles','p')
->innerJoin('p.routegroups','rg')
->innerJoin('rg.routes','r')
->where('u.id = :user_id')->setParameter('user_id', $user->getId())
->getQuery()
->getResult(); …Run Code Online (Sandbox Code Playgroud) 我正在使用Symfony2,我的用户和角色已存储在我的数据库中.如果我设置类似下面的东西,security.yml那么效果很好:
access_control:
- { path: ^/admin, role: ROLE_ADMIN}
- { path: ^/users, role: ROLE_MANAGER}
Run Code Online (Sandbox Code Playgroud)
但我想将此access_control信息存储在数据库中,因此我系统中的用户可以使用管理界面更改权限本身.
我查看了ACL和FOSUserBundle但无法找到解决方案.我发现我可以用类似的东西检查权限,if ($user->hasRole($role))但我需要在每个控制器中执行此操作.
有没有办法定义动态"access_control"功能?也许就像将access_control重定向到某个可能返回true或false的类.有解决方案吗