Eva\EvaEngine\Interceptor\Dispatch::injectInterceptor PHP Method

injectInterceptor() public method

public injectInterceptor ( Phalcon\Mvc\DispatcherInterface $dispatcher ) : boolean
$dispatcher Phalcon\Mvc\DispatcherInterface
return boolean true if cache missed(intercepter injected), false if cache hit(intercepter not injected)
    public function injectInterceptor(DispatcherInterface $dispatcher)
    {
        /**
         * @var \Phalcon\DI $di
         */
        $di = $dispatcher->getDI();
        $config = $di->getConfig();
        // cache is disable
        if (!$config->cache->enable) {
            return true;
        }
        $params = $this->getInterceptorParams($dispatcher);
        if (!$params) {
            return true;
        }
        $methodsAllow = $params['methods'];
        /**
         * @var \Phalcon\Http\Request $request
         */
        $request = $di->getRequest();
        $requestMethod = strtolower($request->getMethod());
        if (false === in_array($requestMethod, $methodsAllow)) {
            return true;
        }
        /**
         * @var \Phalcon\Cache\Backend $cache
         */
        $cache = $di->getViewCache();
        $interceptResult = $this->intercept($request, $params, $cache);
        //cache key matched, response already prepared
        if (true === $interceptResult) {
            if (true === $params['cors_enabled']) {
                //$params
                $di->getCors()->preflightRequests();
            }
            $di->getResponse()->send();
            return false;
        }
        $self = $this;
        //Cache missed
        /**
         * @var \Phalcon\Events\Manager $eventsManager
         */
        $eventsManager = $di->getEventsManager();
        $eventsManager->attach('application:beforeSendResponse', function ($event, $application) use($self, $params) {
            $bodyKey = $self->getCacheBodyKey();
            $headersKey = $self->getCacheHeadersKey();
            if (!$bodyKey || !$headersKey) {
                return true;
            }
            /**
             * @var \Phalcon\Http\ResponseInterface $response
             */
            $response = $application->getDI()->getResponse();
            $body = $response->getContent();
            $headers = $response->getHeaders()->toArray();
            $headersCache = array();
            if ($headers) {
                //Filter allowed headers
                $headersCache = array_intersect_key($headers, array_flip($self->getCachableHeaderKeys()));
            }
            $headersCache[Dispatch::CACHE_HEADER_FLAG] = date(DATE_ISO8601);
            $cache = $application->getDI()->getViewCache();
            $request = $application->getDI()->getRequest();
            $callbackKey = $params['jsonp_callback_key'];
            //Jsonp change to json
            if ($params['format'] == 'jsonp' && $callbackKey && ($callbackValue = $request->getQuery($callbackKey))) {
                $body = Dispatch::changeJsonpToJson($body, $callbackValue);
            }
            $cache->save($bodyKey, $body, $params['lifetime']);
            //$cache->save($headersKey, serialize($headersCache), $params['lifetime']);
            $cache->save($headersKey, json_encode($headersCache), $params['lifetime']);
            return true;
        });
        return true;
    }

Usage Example

Beispiel #1
0
 public function testJsonpCacheHit()
 {
     $_SERVER['HTTP_HOST'] = 'example.com';
     $_SERVER['REQUEST_METHOD'] = 'GET';
     $_SERVER['REQUEST_URI'] = '/path?foo=aaa&bar=bbb&callback=testcallback&_=123456';
     $_GET = array('_url' => '/path', 'foo' => 'aaa', 'bar' => 'bbb', 'callback' => 'testcallback', '_' => '123456');
     $request = new Request();
     $this->di->set('request', $request);
     $this->di->getViewCache()->flush();
     $this->di->getViewCache()->save('d6bd338ec8eb8666f3d054566f335039_b', '{"foo":"bar"}');
     $this->di->getViewCache()->save('d6bd338ec8eb8666f3d054566f335039_h', '{"Content-Type":"application\\/json;+charset=utf-8","X-EvaEngine-Interceptor-Cache":"2014-12-09T06:45:42+0100"}');
     $interceptor = new DispatchInterceptor();
     /**
      * @var Dispatcher $dispatcher
     */
     $dispatcher = $this->di->getDispatcher();
     $dispatcher->setParams(array('_dispatch_cache' => 'lifetime=100&format=jsonp'));
     $this->assertEquals(false, $interceptor->injectInterceptor($dispatcher));
     $this->assertEquals('testcallback({"foo":"bar"})', $this->di->getResponse()->getContent());
 }
All Usage Examples Of Eva\EvaEngine\Interceptor\Dispatch::injectInterceptor