2

我在实体存储库中的所有查询都需要由用户过滤。

现在我想知道如何直接访问实体存储库中当前登录的用户。

我今天所做的是通过使用$this->getUser()在我的控制器中获取当前登录的用户,然后将其传递给实体存储库,这效率不高。

4

2 回答 2

8

您需要将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();
}
于 2015-06-04T06:32:00.850 回答
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;
    }
}
于 2015-06-04T06:46:25.260 回答