예제 #1
0
 /**
  * Execute application
  */
 private final function _execute()
 {
     $_errtype = E_ALL;
     // Set application plugin manager listen global event dispatcher
     $this->getPluginManager()->setTarget(Zoombi::getDispatcher());
     $this->getDispatcher()->connect('_triggerError', array(&$this, '_error_trigger'));
     try {
         // Notify for start execution
         $this->emit(new ZEvent($this, 'preExecute'));
         // Attach error and exception handlers if applicatio execution mode is 'debug'
         if ($this->isMode(self::MODE_DEBUG)) {
             $old_errr = error_reporting($_errtype);
             set_error_handler(array($this, '_error_handler'), $_errtype);
             //set_exception_handler(array( $this, '_exception_handler' ));
         }
         // Notify befor route start
         //$this->emit(new ZEvent($this, 'preRoute'));
         if (!$this->getFlag(self::FLAG_NO_ROUTE)) {
             $request = null;
             // Process request info
             $req_qry = explode('?', $_SERVER['REQUEST_URI'], 2);
             $request = array_shift($req_qry);
             // Get content rewrite variabe
             $rt = $this->getConfig()->getValue('routevar', 'rt');
             $rvar = null;
             if (isset($_GET[$rt])) {
                 $rvar = $_GET[$rt];
                 unset($_GET[$rt]);
             }
             if ($req_qry) {
                 $rvar .= '?' . $req_qry[0];
             }
             // Attach routing rules to router
             $routes = new ZConfig();
             $rs = $this->getConfig()->getValue('routes', null);
             switch (gettype($rs)) {
                 case 'array':
                 case 'object':
                     $routes->setData($rs);
                     break;
                 case 'string':
                     $routes->fromFile($this->fromBaseDir($rs));
                     break;
             }
             $this->getRouter()->setRules($routes->toArray());
             unset($routes);
             $this->emit(new ZEvent($this, 'preRoute', $rvar));
             $this->getRouter()->setRequest($rvar);
             $redir = $this->getRouter()->route($rvar);
             $p = new ZRoute($redir);
             if (!$this->getLoader()->hasModule($p->getModule()) and $p->getModule() != $this->getName()) {
                 $p->push_start($this->getName());
             }
             $fix = $this->fixroute($p);
             $this->getRouter()->setRedirect($fix)->setCurrent($fix)->setForward($fix);
             $this->emit(new ZEvent($this, 'postRoute', $fix));
             $approute = true;
             if ($p->getModule() == $this->getName()) {
                 $p->pop_start();
             }
             $this->route($p, array('approute'));
             $approute = false;
         }
     } catch (ZException $e) {
         switch ($e->getCode()) {
             case ZControllerException::EXC_QUIT:
                 $this->getConfig()->setValue('output', false);
                 break;
             case ZControllerException::EXC_QUIT_OUTPUT:
                 $this->getConfig()->setValue('output', true);
                 break;
             case ZControllerException::EXC_LOAD:
             case ZControllerException::EXC_NO_FILE:
             case ZControllerException::EXC_ACTION:
                 $this->emit(new ZEvent($this, 'onError', 404, $e));
                 $this->emit(new ZEvent($this, 'on404', $this->getRoute()));
                 break;
             case ZControllerException::EXC_DENY:
                 $this->emit(new ZEvent($this, 'onError', 403, $e));
                 $this->emit(new ZEvent($this, 'on403', $this->getRoute()));
                 break;
             case ZControllerException::EXC_AUTH:
                 $this->emit(new ZEvent($this, 'onError', 401, $e));
                 $this->emit(new ZEvent($this, 'on401', $this->getRoute()));
                 break;
             default:
                 $this->emit(new ZEvent($this, 'onError', 500, $e));
                 $this->emit(new ZEvent($this, 'on500', $e));
                 break;
         }
     }
     if (Zoombi::ack($this->getConfig()->getValue('output', false))) {
         ob_start();
         if (Zoombi::ack($this->getConfig()->get('showerror', 'false'))) {
             foreach ($this->m_errors as $e) {
                 $this->showError($e);
             }
         }
         $this->emit(new ZEvent($this, 'onOutput'));
         $cnt = ob_get_contents();
         ob_end_clean();
         ZResponse::getInstance()->setContent(ZResponse::getInstance()->getContent() . $cnt);
     }
     $this->emit(new ZEvent($this, 'postExecute'));
     if ($this->isMode(self::MODE_DEBUG)) {
         restore_error_handler();
         error_reporting($old_errr);
     }
     ZResponse::getInstance()->output();
 }
예제 #2
0
 /**
  * Route path
  * @param string $a_path
  * @return ZModule
  */
 public final function &route($a_path, $a_args = array())
 {
     Zoombi::getApplication()->m_route_deep++;
     switch (gettype($a_path)) {
         case 'string':
             if (substr($a_path, 0, 1) == Zoombi::SS) {
                 return $this->_reRoute(Zoombi::getApplication(), substr($a_path, 1), $a_args);
             }
             break;
         case 'object':
             if (!$a_path instanceof ZRoute) {
                 return $this;
             }
             break;
         default:
             return $this;
             break;
     }
     $p = new ZRoute($a_path);
     $m = $p->getModule();
     if (empty($m)) {
         $m = $this->getConfig()->getValue('module.default_name', self::DEFAULT_MODULE_NAME);
     }
     $this->emit(new ZEvent($this, 'preModule', $m));
     if ($this->getLoader()->hasModule($m)) {
         $mod = $this->getLoader()->module($m);
         if (!$mod) {
             throw new ZModuleException('Bad module');
         }
         $this->emit(new ZEvent($this, 'postModule', $mod));
         return $this->_reRoute($mod, $p->pop_start(), $a_args);
     }
     $this->emit(new ZEvent($this, 'postModule', $this));
     $p->push_start($this->getName());
     $route = $p;
     $c = $route->getController();
     $a = $route->getAction();
     if (empty($c)) {
         $route->setController($this->getConfig()->getValue('controller.default_name', self::DEFAULT_CONTROLLER_NAME));
     }
     if (empty($a)) {
         $route->setAction($this->getConfig()->getValue('controller.default_action', self::DEFAULT_ACTION_NAME));
     }
     $c = $route->getController();
     $a = $route->getAction();
     $this->emit(new ZEvent($this, 'preController', $c));
     $ctl = null;
     $ctl = $this->getLoader()->controller($c);
     if (!$ctl) {
         throw new ZModuleException('Module "' . $this->getName() . '" can\'t find controller "' . $c . '".');
     }
     $this->emit(new ZEvent($this, 'postController', $c, $ctl));
     if (!$ctl->hasAction($a)) {
         throw new ZModuleException('Module "' . $this->getName() . '" can\'t find controller "' . $c . '" action "' . $a . '".');
     }
     $this->emit(new ZEvent($this, 'preAction', $a));
     $this->setRoute($route)->setArgs($a_args);
     $this->m_return = $ctl->requestAction($a, $this->getRoute()->getParamsArray(), $this->m_output);
     return $this->emit(new ZEvent($this, 'postAction', $a));
 }