KumbiaPHP beta2-dev
Framework PHP en español
console.php
Ir a la documentación de este archivo.
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 }
 Todo Estructuras de Datos Namespaces Archivos Funciones Variables Enumeraciones