Exemplo n.º 1
0
 /**
  * 重定向请求到新的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);
 }
Exemplo n.º 3
0
 /**
  * 解析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;
 }
Exemplo n.º 4
0
 /**
  * 重定向请求到新的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");
 }
Exemplo n.º 6
0
 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);
 }