首页 > 解决方案 > 如何在 Symfony 中将 CacheInterface 与 Paginator 一起使用?

问题描述

我正在尝试使用 Symfony 5.3.9 中的 CacheInterface 缓存我的查询。我收到“无法保存数组类型的密钥“my_key”。” 当我使用返回 Paginator 项目的自定义查询时,它与经典查询完美配合。

如何使用 Paginator 缓存我的查询?代码示例,我的控制器:

public function index(EventRepository $eventRepo, AnalysisRepository $analysisRepo, UserContestRepository $userContestRepo, CacheInterface $cache): Response
{
    $events = $cache->get('events_index', function(ItemInterface $item) use($eventRepo) {
        $item->expiresAfter(1800);
        return $eventRepo->getUpcoming(6);
    });

    $highlight = $cache->get('highlight_index', function(ItemInterface $item) use($userContestRepo) {
        $item->expiresAfter(1800);
        return $userContestRepo->findHighlight(3); 
    });
        
    return $this->render('home/index.html.twig', [
        'controller_name' => 'HomeController',
        'curr_nav' => 'home',
        'events' => $events,
        'highlight' => $highlight,
    ]);

我的 userContestRepository :

public function findHighlight(int $limit = 0) {

    $qb = $this->createQueryBuilder('uc')
        ->leftJoin('uc.user', 'ucu')
        ->addSelect('ucu')
        ->leftJoin('uc.contest', 'ucc')
        ->addSelect('ucc')
        ->where('ucc.slug = :slug')
        ->andWhere('ucu.isActive = true')
        ->setParameter('slug', 'en-vogue')
        ->orderBy('uc.points', 'DESC')
    ;

    if ($limit > 0) {
        $qb->setMaxResults($limit);
        return new Paginator($qb, $fetchJoin = true);
    }
    return $qb->getQuery()->getResult();
}

还有我的 EventRepository :

public function getUpcoming(int $limit = 0, $sport = 'soccer', $onlyVisibleAnalysis = true)
{
    $dateD = new DateTime();
    $dateD->modify('+7 day');
    $now = new \DateTime("NOW");
    $now->modify("-3 hour");

    $qb = $this->createQueryBuilder('e')
        ->leftJoin('e.competition', 'ec')
        ->addSelect('ec');
        
    if($onlyVisibleAnalysis == true) {
        $qb->leftJoin('e.analyses', 'ea', 'WITH', 'ea.isVisible = true')
        ->addSelect('ea');
    }
    else {
        $qb->leftJoin('e.analyses', 'ea')
        ->addSelect('ea');
    }
    $qb->leftJoin('e.homeTeam', 'eht')
        ->addSelect('eht')
        ->leftJoin('e.awayTeam', 'eat')
        ->addSelect('eat')
        ->orderBy(("DATE_FORMAT(e.eventDate,'%d-%M-%Y')"), 'ASC')
        ->addOrderBy('SIZE(e.analyses)', 'DESC')
        ->addOrderBy('e.eventDate', 'ASC')
        ->where('e.eventDate BETWEEN :now AND :date')
        ->andWhere('e.sport = :sport')
        ->setParameter('date', $dateD)
        ->setParameter('now', $now)
        ->setParameter('sport', $sport);
    if($limit > 0) {
        $qb->setMaxResults($limit);
        return new Paginator($qb, $fetchJoin = true);
    }
    return $qb->getQuery()
        ->getResult();
}

提前谢谢你,希望我在 StackOverflow 上提供了我是新手的所有细节 :)

标签: symfonycaching

解决方案


推荐阅读