クラスに2人のリスナーを追加しますModule
。route
一致がキャッシュされたものであるかどうかの直後に、1人のリスナーが早期にチェックします。2番目のリスナーrender
は、出力を待機して取得し、キャッシュに保存します。
namespace MyModule;
use Zend\Mvc\MvcEvent;
class Module
{
public function onBootstrap(MvcEvent $e)
{
// A list of routes to be cached
$routes = array('foo/bar', 'foo/baz');
$app = $e->getApplication();
$em = $app->getEventManager();
$sm = $app->getServiceManager();
$em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($sm) {
$route = $e->getRouteMatch()->getMatchedRouteName();
$cache = $sm->get('cache-service');
$key = 'route-cache-' . $route;
if ($cache->hasItem($key)) {
// Handle response
$content = $cache->getItem($key);
$response = $e->getResponse();
$response->setContent($content);
return $response;
}
}, -1000); // Low, then routing has happened
$em->attach(MvcEvent::EVENT_RENDER, function($e) use ($sm, $routes) {
$route = $e->getRouteMatch()->getMatchedRouteName();
if (!in_array($route, $routes)) {
return;
}
$response = $e->getResponse();
$content = $response->getContent();
$cache = $sm->get('cache-service');
$key = 'route-cache-' . $route;
$cache->setItem($key, $content);
}, -1000); // Late, then rendering has happened
}
}
必ずcache-service
サービスマネージャでキャッシュインスタンスを登録してください。上記の例を更新して、レンダリングイベント中にルートが$routes
配列内にあるかどうかを確認できます。in_array($route, $routes)
ここで、キャッシュにキーがあるかどうかを確認します。これは、イベント中の場合よりも遅くなる可能性がありますrender
。