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 }