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