如何在存储库Symfony 2.7中获取当前用户

时间:2015-06-04 03:22:27

标签: symfony repository entity symfony-2.7

我在Entity Repository中的所有查询都需要由用户进行过滤。

现在我想知道如何直接访问Entity Repository中当前登录的用户。

我今天所做的是通过使用 $ this-> getUser()来获取我的控制器中当前登录的用户,然后将其传递给Entity Repository,这样效率不高

2 个答案:

答案 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;
    }
}