我在实体存储库中的所有查询都需要由用户过滤。
现在我想知道如何直接访问实体存储库中当前登录的用户。
我今天所做的是通过使用$this->getUser()在我的控制器中获取当前登录的用户,然后将其传递给实体存储库,这效率不高。
我在实体存储库中的所有查询都需要由用户过滤。
现在我想知道如何直接访问实体存储库中当前登录的用户。
我今天所做的是通过使用$this->getUser()在我的控制器中获取当前登录的用户,然后将其传递给实体存储库,这效率不高。
您需要将security.token_storage
服务注入另一个以获取当前用户,但由于 Repository 类属于 Doctrine 项目,而不是 Symfony,不建议这样做.. 可能有一种方法可以通过创建自定义 entityManager 类来实现如此处所述,但我认为这不是一个好的解决方案..
与其定制entityManager
更好的创建调用存储库类方法的服务,不如将所需的服务注入其中。让存储库类完成它们的工作。
实现将是这样的:
存储库类:
class MyRepository extends EntityRepository
{
public function fetchSomeDataByUser(UserInterface $user)
{
// query
}
}
服务:
class MyService
{
private $tokenStorage;
public function _construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
// other services
}
public function getSomeDataByUser()
{
$user = $this->tokenStorage->getToken()->getUser();
return $this->entityManager->getRepository(MyREPOSITORY)->fetchSomeDataByUser($user);
}
}
用法:
public function someAction()
{
$dataByUser = $this->get(MYSERVICE)->getSomeDataByUser();
}
如果您使用JMSDiExtraBundle,可以通过添加 setter 注入来完成:
use Doctrine\ORM\EntityRepository;
use JMS\DiExtraBundle\Annotation as DI;
class YourRepository extends EntityRepository
{
/** @var User current user entity */
protected $user;
/**
* @DI\InjectParams({
* "token_storage" = @DI\Inject("security.token_storage")
* })
*/
public function setSimplaManager(TokenStorageInterface $tokenStorage)
{
$token = $tokenStorage->getToken();
if (!is_object($user = $token->getUser())) {
// e.g. anonymous authentication
return;
}
$this->user = $user;
}
}