Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
afin d'améliorer les performances de mon application, je souhaiterais mettre en cache les retours du Paginator. J'ai vu dans la doc qu'on pouvait mettre en cache les données issues de celui-ci via la méthode setCache().
Ce que j'ai pour l'instant au niveau de mon paginator est ceci :
[lang=php] // méthode générique pour l'ensemble des données paginées de mon application public function setPaginator($select, $limit = null) { $doctrineAdapter = new DoctrinePaginator(new \Doctrine\ORM\Tools\Pagination\Paginator($select)); $paginator = new Paginator($doctrineAdapter); (isset($limit) && $limit>0) ? $paginator->setItemCountPerPage($limit) : ($this->params('nbrowpage', null) ? $paginator->setItemCountPerPage($this->params('nbrowpage')): $paginator->setItemCountPerPage(LIMIT)); $paginator->setCurrentPageNumber($this->params('page', 1)); return $paginator; }
J'ai donc suivi la doc afin de mettre les données en cache pour avoir une fonction du style :
[lang=php] public function setPaginator($select, $limit = null) { $doctrineAdapter = new DoctrinePaginator(new \Doctrine\ORM\Tools\Pagination\Paginator($select)); $paginator = new Paginator($doctrineAdapter); (isset($limit) && $limit>0) ? $paginator->setItemCountPerPage($limit) : ($this->params('nbrowpage', null) ? $paginator->setItemCountPerPage($this->params('nbrowpage')): $paginator->setItemCountPerPage(LIMIT)); $paginator->setCurrentPageNumber($this->params('page', 1)); $cache = StorageFactory::adapterFactory( 'filesystem', [ 'ttl' => 3600, ] ); $cache->addPlugin( StorageFactory::pluginFactory( 'serializer' ) ); $paginator::setCache( $cache ); if ( \is_array( $paginator->getPageItemCache() ) ) { return $paginator->getPageItemCache(); } return $paginator; }
Le problème, c'est d'une fois que j'ai les données en cache, je pers totalement la pagination et l'accès aux autres pages...
Je pense que je m'y prends mal et que je ne devrais pas retourner les données en cache via le return $paginator->getPageItemCache().
J'ai donc testé sans retourné les pages en cache via la méthode précédemment citée mais il ne me semble pas que les données en cache soient récupérées. Quand je regarde au niveau du nombre de requêtes de ma page, celui-ci n'est pas modifié, même quand je fais appel à des données présentent dans le cache...
Avez-vous déjà eu ce genre de problème ? Comment je pourrais m'y prendre pour récupérer à la fois les données en cache et la pagination ?
Merci d'avance pour vos réponses.
Romain
Hors ligne
Salut,
pas d'idées pour ce petit problème ?
Romain
Hors ligne
Hello, personnellement je ne fais pas comme ça quand j'ai besoin de mettre des données en cache venant de doctrine. Ce que je te conseil c'est directement d'utiliser le cache au niveau de la requête doctrine via la méthode userResultCache
Hors ligne
Salut Orkin,
merci pour ta réponse.
Je pensais utiliser la méthode "useResultCache" de Doctrine mais je me demandais à quels moments les résultats en cache étaient supprimés (en dehors du ttl).
Par exemple, je fait une requête sur le paginator, les résultats sont mis en cache par Doctrine, ok, c'est cool !
Maintenant, sur la même page, j'ai la possibilité de filtrer les résultats via un formulaire. Si j'ai des résultats déjà en cache mais que j'applique un filtre de recherche, est-ce que le cache va être invalidé ?
Concrètement, comment se déroule la mise en cache avec Doctrine (je parle au niveau du cacheResult) ?
Est-ce à moi d'invalider le cache lorsque j'applique un filtre ?
Merci d'avance !
Hors ligne