PHP   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php – Doctrine 2和ORM:如何缓存某个实体的每个查询?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我很多时候都在解决这个问题,并且发现,正式地说,我只能缓存一些自定义查询(在Query对象上使用resultResultCache(true)).但我需要将我的应用程序中的每个查询缓存到某个表中.那么在Entitymanager上查找*方法呢?… @H_772_1@有人可以帮我找一个优雅的解决方案吗?

目前尚不支持功能,您最终应该在服务层或扩展存储库中处理它. @H_772_1@您正在寻找的是second level cache as in Hibernate,它基本上允许您插入一个键值存储,如redis,riak,mongodb等,以便在操作简单的获取操作时快速启动.

@H_772_1@在https://github.com/doctrine/doctrine2/pull/580有一项@L_696_14@中的拉动请求,可能会在Doctrine ORM 2.5中登陆,所以请查看那个.

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Entitymanager;
use Doctrine\Common\Cache\Cache;
use Doctrine\Common\Cache\ArrayCache;

class MyBaseRepo extends EntityRepository
{
    public function __construct(Entitymanager $entitymanager)
    {
        parent::__construct($entitymanager);
        $cache       = $em->getConfiguration()->getHydrationCache();
        $this->cache = $cache ?: new ArrayCache();
    }

    public function find($id)
    {
        if (!$object = $this->tryFetchFromCache($id)) {
            $object = parent::find($id);
            $this->cache->save($this->generateKey($id),$object);
        }

        return $object;
    }

    protected function tryFetchFromCache($id)
    {
        if (!$object = $this->cache->fetch($this->generateCacheKey($id))) {
            return null;
        }

        return $this->getEntitymanager()->merge($object);
    }

    public function generateCacheKey($id) { /* ... */ }
}
@H_772_1@在引导应用程序时,您可以强制将其作为配置中ORM的基本存储库:

$configuration = new \Doctrine\ORM\Configuration();

$configuration->setDefaultRepositoryClassName('My\MyBaseRepo');
@H_772_1@当您的任何实体发生更新/保存时,这也会强制您清除缓存条目:

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events;

class IssueupdateSubscriber implements EventSubscriber
{
    public function onFlush(OnFlushEventArgs $args)
    {
        $em  = $args->getEntitymanager();
        $uow = $em->getUnitOfWork();

        if (!$cache = $em->getConfiguration()->getHydrationCache()) {
            return;
        }

        $busted = array_merge(
            $uow->getscheduledEntityupdates(),$uow->getscheduledEntitydeletions(),);

        foreach ($busted as $entityToClear) {
            $className  = get_class($entityToClear);
            $Metadata   = $em->getClassMetadata($className);
            $repository = $em->getRepository($className);
            $id         = $Metadata->getIdentifierValues($entityToClear);

            $cache->delete($repository->generateCacheKey($id));
        }
    }

    public function getSubscribedEvents()
    {
        return array(Events::onFlush);
    }
}
@H_772_1@请注意,此实现不会拦截对给定实体的数据库的所有访问.它不会拦截由代理引起的延迟加载初始化,而且它非常脆弱,所以请设置一些适当的集成测试来支持它.

大佬总结

以上是大佬教程为你收集整理的php – Doctrine 2和ORM:如何缓存某个实体的每个查询?全部内容,希望文章能够帮你解决php – Doctrine 2和ORM:如何缓存某个实体的每个查询?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。