/** * 处理错误请求 * * 根据错误请求的相关信息,将程序转向到错误处理句柄进行错误处理 * @param WindErrorMessage $errorMessage * @param int $errorcode * @return void */ protected function sendErrorMessage($errorMessage, $errorcode) { if (is_string($errorMessage)) { $_tmp = $errorMessage; /* @var $errorMessage WindErrorMessage */ $errorMessage = $this->getComponent('errorMessage'); $errorMessage->addError($_tmp); } /* @var $router WindRouter */ $moduleName = $this->handlerAdapter->getModule(); if ($moduleName === 'error') { throw new WindFinalException($errorMessage->getError(0)); } if (!($_errorAction = $errorMessage->getErrorAction())) { $module = $this->getModules($moduleName); $_errorClass = Wind::import(@$module['error-handler']); $_errorAction = 'error/' . $_errorClass . '/run/'; $this->setModules('error', array('controller-path' => array_search($_errorClass, Wind::$_imports), 'controller-suffix' => '', 'error-handler' => '')); } /* @var $forward WindForward */ $forward = $this->getComponent('forward'); $error = array('message' => $errorMessage->getError(), 'code' => $errorcode); $forward->forwardAction($_errorAction, array('__error' => $error), false, false); $this->doDispatch($forward); }
/** * 解析action过滤链的配置信息 * * @param WindSimpleController $handler * @return void */ protected function resolveActionFilters(&$handler) { if (!($filters = $this->getConfig('filters'))) { return; } /* @var $cache AbstractWindCache */ $_filters = array(); if ($cache = Wind::getComponent('windCache')) { $_filters = $cache->get('filters'); } $_token = $this->handlerAdapter->getModule() . '/' . $this->handlerAdapter->getController() . '/' . $this->handlerAdapter->getAction(); if (!isset($_filters[$_token])) { foreach ($filters as $_filter) { if (empty($_filter['class'])) { continue; } $_pattern = empty($_filter['pattern']) ? '' : $_filter['pattern']; unset($_filter['pattern']); if ($_pattern) { $_pattern = str_replace(array('*', '/'), array('\\w*', '\\/'), $_pattern); if (in_array($_pattern[0], array('~', '!'))) { $_pattern = substr($_pattern, 1); if (preg_match('/^' . $_pattern . '$/i', $_token)) { continue; } } else { if (!preg_match('/^' . $_pattern . '$/i', $_token)) { continue; } } } $_filters[$_token][] = $_filter; } $cache && $cache->set('filters', $_filters); } if (empty($_filters[$_token])) { return; } /* @var $proxy WindClassProxy */ $proxy = WindFactory::createInstance(Wind::import('WIND:filter.proxy.WindClassProxy')); $proxy->registerTargetObject($handler); foreach ($_filters[$_token] as $value) { $proxy->registerEventListener($this->factory->createInstance(Wind::import($value['class']), array($handler->getForward(), $handler->getErrorMessage(), $this->handlerAdapter, $value)), 'doAction'); } $handler = $proxy; }