00001 <?php
00022 final class Dispatcher
00023 {
00029 private static $_controller;
00033 const NOT_FOUND_ACTION = 100;
00034 const NOT_FOUND_CONTROLLER = 101;
00035 const NOT_FOUND_FILE_CONTROLLER = 102;
00036
00042 static public function execute ()
00043 {
00044 extract(Router::get(), EXTR_OVERWRITE);
00045
00046 $controllers_dir = APP_PATH . 'controllers';
00047 if ($module) {
00048 $controllers_dir = $controllers_dir . '/' . $module;
00049 }
00050
00051 $app_controller = Util::camelcase($controller) . 'Controller';
00052 $file = "$controllers_dir/$controller".'_controller.php';
00053 if(is_file($file)){
00054 include_once $file;
00058 self::$_controller = $activeController = new $app_controller($module, $controller, $action, $id, $all_parameters, $parameters);
00059
00063 if(Config::get('config.application.database')) {
00064 if(Config::get('config.application.models_autoload')) {
00065 Load::models();
00066 } elseif($activeController->models !== null) {
00067 Load::models($activeController->models);
00068 }
00069 }
00073 if($activeController->initialize() === false) {
00074 return $activeController;
00075 }
00076 if($activeController->before_filter() === false) {
00077 return $activeController;
00078 }
00079
00084 if (!method_exists($activeController, $action)) {
00085 throw new KumbiaException("No se encontró; la Acción \"$action\". Es necesario definir un método en la clase
00086 controladora '$controller' llamado '{$action}' para que
00087 esto funcione correctamente.", Dispatcher::NOT_FOUND_ACTION);
00088 }
00089 call_user_func_array(array($activeController , $action), $parameters);
00090
00094 $activeController->after_filter();
00095 $activeController->finalize();
00096
00100 foreach (Load::get_injected_models() as $model) {
00101 unset($activeController->$model);
00102 }
00106 Load::reset_injected_models();
00107
00108 return $activeController;
00109 } else {
00110 throw new KumbiaException("No se encontró la Clase Controladora \"{$app_controller}\".
00111 Debe definir esta clase para poder trabajar este controlador", self::NOT_FOUND_CONTROLLER);
00112 }
00113 }
00119 public static function get_controller()
00120 {
00121 return self::$_controller;
00122 }
00123 }