如何在Symfony 3.4中装饰存储库类?

时间:2018-08-14 14:02:19

标签: symfony doctrine

我有一个任务,需要使用Redis使用自定义键来缓存理论结果。这是存储库类:

<?php

namespace AppBundle\Repository;


class JobRepository extends EntityRepository implements JobRepositoryInterface
{
    /**
     * @return Job[]
     */
    public function getActiveWithCategory()
    {
        $qb = $this->createQueryBuilder('j');

        return $qb
            ->addSelect('c')
            ->leftJoin('j.category', 'c')
            ->addCriteria(JobCriteria::active())
            ->getQuery()
            ->getResult();
    }
}

接口:

<?php

namespace AppBundle\Repository;


interface JobRepositoryInterface
{
    /**
     * @return Job[]
     */
    public function getActiveWithCategory();
}

是否可以为此存储库创建Decorator并以某种方式说教以返回所需的实现?

或者我必须创建实现接口的服务JobRepositoryService。在这里,我称之为存储库方法。然后创建另一个JobCachedRepositoryService的装饰器JobRepositoryService。而且不要在整个项目中使用$this->getDoctrine()->getRepository('Job')

这是正确的解决方案吗?您将如何解决这个问题?

预先感谢

1 个答案:

答案 0 :(得分:0)

如果您需要使用redis自定义键来缓存学说的结果,可以这样:

<?php

namespace AppBundle\Repository;


class JobRepository extends EntityRepository implements JobRepositoryInterface
{
    /**
     * @return Job[]
     */
    public function getActiveWithCategory()
    {
        $qb = $this->createQueryBuilder('j');

        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);

        $cacheDriver = new Doctrine\Common\Cache\RedisCache();
        $cacheDriver->setRedis($redis);
        $cacheDriver->setNamespace('some_namespace_');

        $query->setResultCacheDriver($cacheDriver);
        $query->useResultCache(true, 3600, 'result_key_in_redis');

        $query =  $qb->addSelect('c')
            ->leftJoin('j.category', 'c')
            ->addCriteria(JobCriteria::active())
            ->getQuery();


        return $query->getResult();
    }
}

您可以通过pecl安装redis lib。