/** * 重定向请求到新的action操作 * * 该种重定向类型,是中断当前的请求执行过程,开启另外的action操作处理.是在一次请求内部进行重定向, * 所以之前的一些处理的结果变量,在重定向后是会继续存在,并可通过forward变量进行访问的.也就是不仅仅是过程的重定向, * 也是状态的重定向. * @param WindForward $forward * @param WindRouter $router * @param boolean $display * @return void */ protected function dispatchWithAction($forward, $router, $display) { if (!($action = $forward->getAction())) { throw new WindException('[web.WindDispatcher.dispatchWithAction] forward fail.', WindException::ERROR_PARAMETER_TYPE_ERROR); } $this->display = $display; list($_a, $_c, $_m) = WindUrlHelper::resolveAction($action); if ($_var = $forward->getArgs()) { $this->getResponse()->setData($_var, 'F'); } $_a && $router->setAction($_a); $_c && $router->setController($_c); $_m && $router->setModule($_m); Wind::getApp()->run(); }
/** * 处理错误请求 * * 根据错误请求的相关信息,将程序转向到错误处理句柄进行错误处理 * @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; }
/** * 重定向请求到新的action操作 * * 该种重定向类型,是中断当前的请求执行过程,开启另外的action操作处理.是在一次请求内部进行重定向, * 所以之前的一些处理的结果变量,在重定向后是会继续存在,并可通过forward变量进行访问的.也就是不仅仅是过程的重定向, * 也是状态的重定向. * @param WindForward $forward * @param WindRouter $router * @param boolean $display * @return void */ protected function dispatchWithAction($forward, $router, $display) { if (!($action = $forward->getAction())) { throw new WindException('[web.WindDispatcher.dispatchWithAction] forward fail.', WindException::ERROR_PARAMETER_TYPE_ERROR); } $this->display = $display; list($_a, $_c, $_m, $arg) = WindUrlHelper::resolveAction($action); foreach ($arg as $key => $value) { $_GET[$key] = $value; } foreach ($forward->getArgs() as $key => $value) { $_POST[$key] = $value; } $_a && $router->setAction($_a); $_c && $router->setController($_c); $_m && $router->setModule($_m); Wind::getApp()->run(); }
/** * @dataProvider dataForResolvedActionMethod */ public function testResolvedActionMethod($action) { $router = new WindRouter(); $router->setAction($action); try { $this->testController->doAction($router); } catch (WindException $e) { $this->assertEquals(WindException::ERROR_CLASS_METHOD_NOT_EXIST, $e->getCode()); return; } $this->fail("ResolvedActionMethod Test Error"); }
protected function setParams($params, $request) { parent::setParams($params, $request); $app = isset($params[$this->appKey]) ? $params[$this->appKey] : $request->getRequest($this->appKey); $app && $this->setApp($app); }