Esempio n. 1
0
 public static function noControllerResponse(XenForo_RouteMatch $routeMatch, Zend_Controller_Request_Http $request)
 {
     self::sendErrorPageHeaders();
     if (XenForo_Application::debugMode()) {
         echo 'Failed to get controller response and reroute to error handler (' . $routeMatch->getControllerName() . '::action' . $routeMatch->getAction() . ')';
         if ($request->getParam('_exception')) {
             echo self::getExceptionTrace($request->getParam('_exception'));
         }
     } else {
         echo self::_getPhrasedTextIfPossible('An unexpected error occurred. Please try again later.', 'unexpected_error_occurred');
     }
 }
 /**
  * Executes the controller dispatch loop.
  *
  * @param XenForo_RouteMatch $routeMatch
  *
  * @return XenForo_ControllerResponse_Abstract|null Null will only occur if error handling is broken
  */
 public function dispatch(XenForo_RouteMatch &$routeMatch)
 {
     $reroute = array('controllerName' => $routeMatch->getControllerName(), 'action' => $routeMatch->getAction());
     $allowReroute = true;
     do {
         if (isset($reroute['path'])) {
             $routeMatch = $this->route($reroute['path']);
             $reroute = array('controllerName' => $routeMatch->getControllerName(), 'action' => $routeMatch->getAction());
         }
         $controllerResponse = null;
         $controllerName = $reroute['controllerName'];
         $action = str_replace(array('-', '/'), ' ', strtolower($reroute['action']));
         $action = str_replace(' ', '', ucwords($action));
         if ($action === '') {
             $action = 'Index';
         }
         $reroute = false;
         $controller = $this->_getValidatedController($controllerName, $action, $routeMatch);
         if ($controller) {
             try {
                 try {
                     $controller->preDispatch($action, $controllerName);
                     $controllerResponse = $controller->{'action' . $action}();
                 } catch (XenForo_ControllerResponse_Exception $e) {
                     $controllerResponse = $e->getControllerResponse();
                 }
                 $controller->postDispatch($controllerResponse, $controllerName, $action);
                 $reroute = $this->_handleControllerResponse($controllerResponse, $controllerName, $action);
             } catch (Exception $e) {
                 // this is a bit hacky, but it's a selective catch so it's a strange case
                 if ($e instanceof XenForo_Exception && $e->isUserPrintable()) {
                     $controllerResponse = $this->_getErrorResponseFromException($e);
                     $controller->postDispatch($controllerResponse, $controllerName, $action);
                 } else {
                     if (!$allowReroute) {
                         break;
                     }
                     $reroute = $this->_rerouteServerError($e);
                     $allowReroute = false;
                     XenForo_Error::logException($e);
                 }
             }
             $responseType = $controller->getResponseType();
             $this->_dependencies->mergeViewStateChanges($controller->getViewStateChanges());
         } else {
             if (!$allowReroute) {
                 break;
             }
             $reroute = $this->_rerouteNotFound($controllerName, $action);
             $allowReroute = false;
         }
     } while ($reroute);
     if ($controllerResponse instanceof XenForo_ControllerResponse_Abstract) {
         $controllerResponse->controllerName = $controllerName;
         $controllerResponse->controllerAction = $action;
     }
     return $controllerResponse;
 }