Zend Framework 2 oferuje kilka różnych adapterów pozwalających na cache poszczególnych elementów, które chcemy składować w pamięci podręcznej. Poniżej przedstawię sposób konfiguracji cache opartego na systemie plików.
Konfiguracja adaptera
W pierwszym kroku musimy ustawić konfigurację adaptera, co dokonuje się w pliku Module.php danego modułu.
public function getServiceConfig() { return array( 'factories' => array( 'cache' => function($sm) { $config = $sm->get('config'); $cache = new Filesyste(); $cache->getOptions()->setTtl($config['cache']['ttl']); $cache->getOptions()->setNamespace($config['cache']['namespace']); $cache->getOptions()->setCacheDir($config['cache']['dir']); $cache->getOptions()->setReadable($config['cache']['active']); $cache->getOptions()->setWritable($config['cache']['active']); $plugin = new ExceptionHandler(); $plugin->getOptions()->setThrowExceptions(false); $cache->addPlugin($plugin); return $cache; }, ) ); }
Jak widać na początku tworzymy obiekt typu Zend\Cache\Storage\Adapter\Filesystem, dla którego następnie ustawiamy czas przechowywania informacji, namespace, katalog w którym przechowywane będą dane. Ostatnie dwie metody: setReadable i setWritable pozwalają nam kontrolować dostęp do cache odpowiednio dla odczytu i zapisu. W powższym przykładzie za pomocą flagi konfiguracyjnej można włączyć bądź wyłączyć cache całkowicie.
Używanie
Poniższy kod pokazuje jak następnie korzystamy z cache w kontrolerze do pobierania informacji.
public function indexAction() { $cache = $this->getServiceLocator()->get('cache'); $item = $cache->getItem( 'smartgroup-item', $success ); if( !$success ) { //fetch item from database as $item $cache->setItem( 'smartgroup-item', $item ) ); } }
Na początku pobieramy instancje obiektu cache z ServiceLocator. Następie próbujemy z cache pobrać daną zapisaną pod nazwą “smartgroup-item”. Metoda getItem() posiada też drugi parametr, który jest callbackiem i określa, czy udało się znaleźć poszukiwaną daną czy nie. W przypadku sukcesu jest ona od razu dostępna jako zmienna $item. W przypadku niepowodzenia ($success === false), możemy pobrać daną np. z bazy danych i przypisać do zmiennej $item, a następnie metodą setItem() ustawić ją w cache.
Cache w zf2 posiada swoją własną fabrykę – wystarczy pod odpowiednim kluczem umieścić konfigurację i otrzymamy gotowy obiekt. Poza tym closure nie jest zalecanym sposobem tworzenia fabryk – ani to nie jest czytelne, ale to się nie cachuje. Tyle mojego marudzenia 😉
Witold: Czy mógłbyś zatem pokazać fragment kodu pokazujący jak wg Twojego rozwiązania skonfigurować cache ?
http://framework.zend.com/manual/current/en/modules/zend.mvc.services.html#zend-cache-service-storagecacheabstractservicefactory