我编写了一个显示系统所有管理员的页面。我想做的是自定义我的查询,以便它将当前经过身份验证的用户从列表中排除。
现在我知道我可以从控制器获取user_id
并将其传递给实体存储库,但我想知道是否有办法直接通过实体存储库访问它?
例如:
use DoctrineORMEntityRepository;
use DoctrineORMNoResultException;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentSecurityCoreUserUserProviderInterface;
use SymfonyComponentSecurityCoreExceptionUsernameNotFoundException;
use SymfonyComponentSecurityCoreExceptionUnsupportedUserException;
class AdminUserRepository extends EntityRepository implements UserProviderInterface
{
public function getAdmins($int = 10, $offset = 0, array $orderBy = array('admin_id', 'asc')){
$admin_id = fetch the admin id ?;
$query = $this->createQueryBuilder('admins')
->where("admins.admin_id != '".$admin_id."'")
->orderBy('admins.'.$orderBy[0], $orderBy[1])
->setFirstResult($offset)
->setMaxResults($int)
->getQuery()
->getResult();
return $query;
}
}
因此,您有一个当前的用户 ID(假设 $currentUserId
),并且您想为具有不等于 $currentUserId
的所有用户编写查询?
试试这个:
class SomeController
{
public function someAction()
{
...
$qb = $userRepository->createQueryBuilder("user")
->where("user.id != ?1")
->setParameter(1, $currentUserId);
$usersExcludingCurrent = $qb->getQuery()->getResult();
...
}
}
编辑
啊,我明白你在说什么了...
好吧,存储库确实应该对自身以外的任何东西视而不见。也就是说,它不是容器感知的,因此应该不知道当前用户是谁。
我的建议是给你的仓库一个函数,该函数可以获取除特定用户或用户 ID 之外的所有内容。
class AdminUserRepository extends EntityRepository implements UserProviderInterface
{
public function getAllAdminsExcept($userId, $int = 10, $offset = 0, array $orderBy = array('admin_id', 'asc'))
{
...
}
}
然后将"当前用户"逻辑放入控制器中。您甚至可以定义一个可以访问@security
和@doctrine
的服务,并将所有逻辑都存放在那里。您的电话,但我想说的是,您绝对应该让您的存储库不知道安全服务中发生的任何情况。
您可以通过以下方式检索用户对象
public function indexAction()
{
$user = $this->getUser();
}
槽控制器或通过树枝模板查看:
<p>Username: {{ app.user.username }}</p>
此示例来自 Symfony 2 Doc。