示例#1
0
 /**
  * Entry point for app
  *
  * @return bool false - not found
  * @throws router_exception
  */
 function dispatch($url = false)
 {
     if ($this->cfg('options.log_requests')) {
         $this->logger->log('request', $url);
     }
     $request = $url ? $url : urldecode($_SERVER['REQUEST_URI']);
     self::event('dispatch_before', array('url' => &$request));
     $skip_site_check = false;
     if (preg_match('@users/(login|logout)/\\z@', $request)) {
         $this->set_cfg_var('in_login', true);
         $skip_site_check = true;
     }
     // returns HTTP_HOST if main_domain not set
     $domain = $_SERVER['HTTP_HOST'];
     //$this->get_main_domain();
     $subdomain = $_SERVER['HTTP_HOST'] != $domain ? substr($_SERVER['HTTP_HOST'], 0, -1 + -1 * strlen($domain)) : false;
     if ('www' === $subdomain) {
         $subdomain = false;
     }
     $this->set_cfg_var('subdomain', $subdomain);
     $cname = false;
     // check for cname
     if ($domain != substr($_SERVER['HTTP_HOST'], -1 * ($sl = strlen($domain)), $sl)) {
         $cname = preg_replace('/^.*\\.([^\\.]+\\.[\\w]+)$/', '$1', $_SERVER['HTTP_HOST']);
         $this->set_cfg_var('cname', $cname);
     }
     // @todo fix tails or errors
     if (false !== ($qpos = strpos($request, '?'))) {
         $request = substr($request, 0, $qpos);
     }
     $dispatcher = self::$modules->get_main();
     if (!$dispatcher) {
         throw new module_exception('Main module not set');
     }
     $this->append_base_url($this->router->get_protocol());
     $this->append_base_url($this->cfg('main_domain'), true);
     if ($dispatcher && functions::is_callable(array($dispatcher, 'predispatch'))) {
         $dispatcher->predispatch($domain, $request);
     }
     /**
      * /domain/module+alias/
      * check path against
      *   - modules list
      *   - alias list
      */
     $request_array = explode('/', $request);
     // remove empty parts
     array_splice($request_array, 0, 1);
     if (empty($request_array[count($request_array) - 1])) {
         array_splice($request_array, -1, 1);
     }
     $request_count = count($request_array);
     // Output filters
     if ($request_count >= 2 && $request_array[$request_count - 2] == 'outfilter') {
         $filter = $request_array[$request_count - 1];
         if (!$this->set_output_filter($filter)) {
             throw new router_exception('Invalid filter - ' . $filter, router_exception::NOT_FOUND);
         }
         array_splice($request_array, -2);
         // @todo slice $request
     }
     $router_module = null;
     if ($this->in_index()) {
         // override frontpage layout
         if ($template = $this->cfg('site.frontpage.template')) {
             $this->renderer->set_page_template($template);
         }
     }
     $root = isset($request_array[0]) ? array_shift($request_array) : false;
     if (!empty($root) && !preg_match('/^[\\w_\\.\\-\\%а-я[:space:]]+$/ui', $root)) {
         throw new router_exception('Root route error');
     }
     if (empty($root)) {
         // use default module as router
         self::$modules->get_main()->set_is_router();
     } else {
         // core module calls
         if ('core' == $root) {
             $this->set_is_router(true);
             $router_module = $this;
         } else {
             if (self::$modules->is_registered($root)) {
                 self::$modules->set_router($root);
             } else {
                 /** @var core_module */
                 $pmod = self::$modules->get_by_alias($root);
                 if ($pmod) {
                     $pmod->set_is_router(true);
                 } else {
                     // default, inject root element
                     array_unshift($request_array, $root);
                     self::$modules->get_main()->set_is_router();
                     // no module found, route to default router (with main flag)
                 }
             }
         }
     }
     // nothing routed?
     $router_module = $router_module ? $router_module : self::$modules->get_router();
     if (!$router_module) {
         throw new router_exception('No router module found');
     }
     $router = $router_module->get_router();
     self::event('route_before', $router);
     if ($router) {
         self::dprint('[ROUTER] using ' . $router_module->get_name());
         $result = $router->route($request_array);
         if (!$result) {
             throw new router_exception('Requested page doesnt exists');
         }
         /*deprecated*/
         /*           
         self::lib('renderer')->set_main_template(
             $router_module->get_controller()->get_template()
         );
         */
     } else {
         throw new router_exception('No router available for ' . ($router_module ? $router_module->get_name() : ''), 0);
     }
 }