/** * @param \Phalcon\Mvc\Dispatcher|\Phalcon\Mvc\DispatcherInterface $dispatcher * @return bool */ public function beforeExecuteRoute($dispatcher) { $this->operator = new OperatorIdentity(); $this->operator->cookies = $this->cookies; $this->operator->load(); // 判断登录 $moduleConfig = $this->di->get('moduleConfig'); $controllerName = $dispatcher->getControllerName(); $actionName = $dispatcher->getActionName(); if ($controllerName == $moduleConfig->operator->login->controller && $actionName == $moduleConfig->operator->login->action) { return true; } if ($this->operator->isLogin()) { // 判断权限 $result = OperatorGroupRight::verify($this->operator->group, $controllerName, $actionName, $dispatcher->getDI()); // 权限不足,输出错误 if (!$result) { $content = ''; if ($this->request->isAjax()) { $resp = new ResponseResult(); $resp->sendError(ResponseResultStatus::RIGHT_VERIFY_FAIL, '权限不足!'); $content = $resp->getContent(); } else { $content = '访问权限不足!'; } $this->view->disable(); echo $content; } return $result; } if ($this->request->isAjax()) { $resp = new ResponseResult(); $resp->sendError(ResponseResultStatus::USER_TOKEN_EXPIRES, '未登录!'); echo $resp->getContent(); } else { $this->response->redirect($moduleConfig->operator->login->url); } $this->view->disable(); return false; }
/** * @param DispatcherInterface $dispatcher * @return bool 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) { $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; }
/** * * * @param $event * @param DispatcherInterface $dispatcher */ public function beforeExecuteRoute(Event $event, DispatcherInterface $dispatcher) { /** @var \Phalcon\DI $di */ $di = $dispatcher->getDI(); $config = $di->getConfig(); // cache is disable if (!$config->cache->enable) { return; } $dispatch_cache_config = $dispatcher->getParam('_dispatch_cache'); if (!$dispatch_cache_config) { return; } /** @var \Phalcon\Http\Request $request */ $request = $di->getRequest(); $params = $this->parseParams($dispatch_cache_config); $lifetime = intval($params['lifetime']); $methodsAllow = $params['methods']; if ($lifetime <= 0) { return; } if (!$methodsAllow) { $methodsAllow = 'get'; } $methodsAllow = explode('|', strtolower($methodsAllow)); $requestMethod = strtolower($request->getMethod()); if (!in_array($requestMethod, $methodsAllow)) { return; } $cache_key_prefix = $_SERVER['HTTP_HOST'] . preg_replace('/[&?]_eva_refresh_dispatch_cache\\=1/i', '', $_SERVER['REQUEST_URI']) . file_get_contents('php://input'); $cache_key_prefix = md5($cache_key_prefix); /** @var \Phalcon\Cache\Backend\Memcache $cache */ $cache = $di->getViewCache(); $bodyKey = $cache_key_prefix . '_b'; $headersKey = $cache_key_prefix . '_h'; $bodyCached = $cache->get($bodyKey); $headersCached = $cache->get($headersKey); $hasCached = $headersCached && $bodyCached; // cache missing if ($di->getRequest()->getQuery('_eva_refresh_dispatch_cache') || !$hasCached) { /** @var \Phalcon\Events\Manager $eventsManager */ $eventsManager = $di->get('eventsManager'); $eventsManager->attach('application:beforeSendResponse', function ($event, $application) use($di, $headersKey, $bodyKey, $lifetime, $cache) { /** @var \Phalcon\Http\ResponseInterface $response */ $response = $di->getResponse(); $body = $response->getContent(); $headers = $response->getHeaders()->toArray(); !$headers && ($headers = array()); $headersByHeaderFunc = headers_list(); if ($headersByHeaderFunc) { $headers = array_merge($headers, $headersByHeaderFunc); } $headers['Eva-Dsp-Cache'] = time(); $cache->save($bodyKey, $body, $lifetime); $cache->save($headersKey, serialize($headers), $lifetime); }); return; } /** @var \Phalcon\Http\ResponseInterface $response */ $response = $di->getResponse(); if ($hasCached) { if ($headersCached) { $headersCached = unserialize($headersCached); isset($headersCached['Eva-Dsp-Cache']) && ($headersCached['Eva-Dsp-Cache'] = date('Y-m-d H:i:s', $headersCached['Eva-Dsp-Cache'])); foreach ($headersCached as $_k => $_herder) { if (is_int($_k)) { $response->setRawHeader($_herder); } else { $response->setHeader($_k, $_herder); } } } $response->setContent($bodyCached); $response->send(); exit; } }