示例#1
0
 public function __construct($request)
 {
     $this->isCore = false;
     if (is_string($request)) {
         $path = $request;
         $this->url = $path;
     } else {
         $this->request = $request;
         if ($this->request->querystring != '') {
             parse_str($this->request->querystring, $this->vars);
         }
         $path = $this->request->getPathInfo();
         $this->url = $this->request->path;
     }
     mtrace('Context path: ' . $path);
     $pathParts = explode('/', $path);
     $app = array_shift($pathParts);
     if ($app != '') {
         if ($app == 'core') {
             $this->isCore = true;
             $app = array_shift($pathParts);
         }
         $this->app = $app;
         $part = array_shift($pathParts);
         // check for module
         $namespace = $this->getNamespace($this->app, $part);
         if ($part && Manager::existsNS($namespace)) {
             $this->module = $part;
             $part = array_shift($pathParts);
         } else {
             $this->module = '';
         }
         // check for controller/component/service
         $ctlr = $part;
         $controller = $component = $service = '';
         while ($part && ($controller == '' && $component == '' && $service == '')) {
             $namespace = $this->getNamespace($this->app, $this->module, '', 'controllers');
             $ns = $namespace . $part . 'Controller.php';
             if (Manager::existsNS($ns)) {
                 $controller = $part;
                 $part = array_shift($pathParts);
             } else {
                 $namespace = $this->getNamespace($this->app, $this->module, '', 'services');
                 $ns = $namespace . $part . 'Service.php';
                 if (Manager::existsNS($ns)) {
                     $service = $part;
                     $part = array_shift($pathParts);
                 } else {
                     $namespace = $this->getNamespace($this->app, $this->module, '', 'components');
                     $ns = $namespace . $part . '.php';
                     if (Manager::existsNS($ns)) {
                         $component = $part;
                         $part = array_shift($pathParts);
                     } else {
                         $part = array_shift($pathParts);
                     }
                 }
             }
         }
     } else {
         $this->app = Manager::getOptions('startup');
         $controller = 'main';
     }
     if ($controller) {
         $this->controller = $controller;
     } elseif ($service) {
         $this->service = $service;
     } elseif ($component) {
         $this->component = $component;
     } else {
         throw new ENotFoundException(_M("App: [%s], Module: [%s], Controller: [%s] : Not found!", array($this->app, $this->module, $ctlr)));
     }
     $this->action = $part ?: ($component == '' ? 'main' : '');
     $this->actionTokens[0] = $this->controller;
     $this->actionTokens[1] = $this->action;
     $this->currentToken = 1 + ($this->module ? 1 : 0);
     if ($n = count($pathParts)) {
         for ($i = 0; $i < $n; $i++) {
             $this->actionTokens[$i + 2] = $this->vars[$pathParts[$i]] = $pathParts[$i];
         }
     }
     $this->id = $this->vars['item'] ?: $this->actionTokens[2];
     if ($this->id !== '') {
         $_REQUEST['id'] = $this->id;
     }
     Manager::getInstance()->application = $this->app;
     mtrace('Context app: ' . $this->app);
     mtrace('Context module: ' . $this->module);
     mtrace('Context controller: ' . $this->controller);
     mtrace('Context service: ' . $this->service);
     mtrace('Context component: ' . $this->component);
     mtrace('Context action: ' . $this->action);
     mtrace('Context id: ' . $this->id);
 }