我在Entity Repository中的所有查询都需要由用户进行过滤。
现在我想知道如何直接访问Entity Repository中当前登录的用户。
我今天所做的是通过使用 $ this-> getUser()来获取我的控制器中当前登录的用户,然后将其传递给Entity Repository,这样效率不高
答案 0 :(得分:7)
你需要将security.token_storage
服务注入另一个服务以获取当前用户,但是从Repository类到属于Doctrine项目,而不是Symfony,不建议这样做。可能有一种方法通过创建here描述的自定义entityManager类来实现它,但我认为这不是一个好的解决方案..
而不是自定义entityManager
更好地创建一个调用存储库类的服务'方法,将所需的服务注入其中。让Repository类完成它们的工作。
实施将是这样的:
RepositoryClass:
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();
}
答案 1 :(得分:2)
如果您使用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;
}
}