J'ai un site avec une gallerie qui fonctionne avec une pagination à scroll. C'est à dire que lorsque qu'on arrive en bas de page une requete est envoyer en ajax puis récupère les photos suivante et les insères dans la page.

j'aimerai dans le controller qui récupère les photos mettre en cache les photos récupéré pour qu'a la prochaine visite on pioche directement dans le cache. j'utilise memcached cela dit en passant.

Le problème est que lorsque je met en cache la requête je me mange l'erreur suivante "Serialization of 'Closure' is not allowed". en gros on peu pas mettre en cache la closure.

y aurais t-il un moyen de rémédier à ce problème ou y a t-il une autre solution pour mettre en cache.

Je vous met le code de mon controller :

/**
 * Page index de la gallery qui affiche les première photos puis les requete ajax
 */
public function indexAction(Request $request)
{
    $page = $request->get('page');

    //ICI JE VOUDRAIS METTRE EN CACHE CETTE REQUETE AVEC MEMCACHED AVANT DE LA REFILER AU PAGINATOR
    //MAIS JE N'Y PARVIENS PAS CAR ON NE PEUT PAS CACHE UNE QUERY :(
    $query = $this->queryForModel('Category',$page);

    $medias = $this->paginate($query,$request);

    return $this->render('PortfolioBundle:Portfolios:index.html.twig',['medias'=>$medias]);

}

/**
 * Récupération des photos
 */
public function queryForModel($page, $page_number)
{
    $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select('m')
        ->from($this->_entityName,'m')
        ->where('m.page = :page')
        ->orderBy('m.id','DESC')
        ->setParameter('page',$page)
    ;

    return $query;
}

/**
 * Paginator
 */
public function paginate($query, Request $request, $limit=9){
    $page = (int) $request->get('page') ? : 1;
    $query
        ->setFirstResult(($page-1) * $limit)
        ->setMaxResults($limit);

    return new Paginator($query,true);
}

merci d'avance :)

1 réponse


Pourquoi ne pas mettre tous les résultats générés en session ? Exemple, un tableau avec les données dont tu as besoin, par exemple le path des photos, le titre, la description, etc. Tu peux aussi stocker les objets eux-même.
Tu les affiches au début, que si le tableau n'est pas vide.
De cette facon tu économises une requête et tu gagnes en temps de chargement.
Stocker la query n'est pas la bonne solution, il vaut mieux stocker les paramètres et les arguments qui permettent de la générer.