KumbiaPHP beta2-dev
Framework PHP en español
|
00001 <?php 00026 require CORE_PATH . 'kumbia/util.php'; 00030 require CORE_PATH . 'kumbia/kumbia_exception.php'; 00034 require CORE_PATH . 'kumbia/config.php'; 00038 require CORE_PATH . 'kumbia/load.php'; 00039 00048 class Console 00049 { 00057 private static function _getConsoleArgs($argv) 00058 { 00059 $args = array(array()); 00060 00061 foreach($argv as $p) { 00062 if(is_string($p) && preg_match("/--([a-z_0-9]+)[=](.+)/", $p, $regs)){ 00063 // carga en el array de parametros nombrados 00064 $args[0][$regs[1]] = $regs[2]; 00065 } else { 00066 // lo carga como argumento simple 00067 $args[] = $p; 00068 } 00069 } 00070 00071 return $args; 00072 } 00073 00081 public static function load($console_name) 00082 { 00083 // nombre de la clase de consola 00084 $Console = Util::camelcase($console_name) . 'Console'; 00085 00086 if(!class_exists($Console)) { 00087 // intenta carga el archivo de consola 00088 $file = APP_PATH . "extensions/console/{$console_name}_console.php"; 00089 00090 if(!is_file($file)) { 00091 $file = CORE_PATH . "console/{$console_name}_console.php"; 00092 00093 if(!is_file($file)) { 00094 throw new KumbiaException('Consola "' . $file . '" no se encontro'); 00095 } 00096 } 00097 00098 // incluye la consola 00099 include_once $file; 00100 } 00101 00102 // crea la instancia de objeto 00103 $console = new $Console(); 00104 00105 // inicializa la consola 00106 if(method_exists($console, 'initialize')) { 00107 $console->initialize(); 00108 } 00109 00110 return $console; 00111 } 00112 00119 public static function dispatch($argv) 00120 { 00121 // Elimino el nombre de archivo del array de argumentos 00122 array_shift($argv); 00123 00124 // obtiene el nombre de consola 00125 $console_name = array_shift($argv); 00126 if(!$console_name) { 00127 throw new KumbiaException('No ha indicado la consola a ejecutar'); 00128 } 00129 00130 // obtiene el nombre de comando a ejecutar 00131 $command = array_shift($argv); 00132 if(!$command) { 00133 $command = 'main'; 00134 } 00135 00136 // Obtiene los argumentos para la consola, el primer argumento 00137 // es el array de parametros nombrados para terminal 00138 $args = self::_getConsoleArgs($argv); 00139 00140 // verifica el path de aplicacion 00141 if(isset($args[0]['path'])) { 00142 $dir = realpath($args[0]['path']); 00143 if(!$dir) { 00144 throw new KumbiaException("La ruta \"{$args[0]['path']}\" es invalida"); 00145 } 00146 // elimina el parametro path del array 00147 unset($args[0]['path']); 00148 } else { 00149 // obtiene el directorio de trabajo actual 00150 $dir = getcwd(); 00151 } 00152 00153 // define el path de la aplicacion 00154 define('APP_PATH', rtrim($dir, '/') . '/'); 00155 00156 // lee la configuracion 00157 $config = Config::read('config'); 00158 00159 // constante que indica si la aplicacion se encuentra en produccion 00160 define('PRODUCTION', $config['application']['production']); 00161 00162 // crea la consola 00163 $console = self::load($console_name); 00164 00165 // verifica que exista el comando en la consola 00166 if(!method_exists($console, $command)) { 00167 throw new KumbiaException("El comando \"$command\" no existe para la consola \"$console_name\""); 00168 } 00169 00170 // si se intenta ejecutar 00171 if($command == 'initialize') { 00172 throw new KumbiaException("El comando initialize es un comando reservado"); 00173 } 00174 00175 // verifica los parametros para la accion de consola 00176 $reflectionMethod = new ReflectionMethod($console, $command); 00177 if(count($args) < $reflectionMethod->getNumberOfRequiredParameters()){ 00178 throw new KumbiaException("Número de parametros erroneo para ejecutar el comando \"$command\" en la consola \"$console_name\""); 00179 } 00180 00181 // ejecuta el comando 00182 call_user_func_array(array($console, $command), $args); 00183 } 00184 00192 public static function input($message, $values=NULL) 00193 { 00194 // abre la entrada 00195 $stdin = fopen('php://stdin', 'r'); 00196 00197 do { 00198 // imprime el mensaje 00199 echo $message; 00200 00201 // lee la linea desde el terminal 00202 $data = str_replace(PHP_EOL, '', fgets($stdin)); 00203 } while($values && !in_array($data, $values)); 00204 00205 // cierra el recurso 00206 fclose($stdin); 00207 00208 return $data; 00209 } 00210 }