KumbiaPHP  beta2
Framework PHP
 Todo Estructuras de Datos Namespaces Archivos Funciones Variables Páginas
console.php
Ir a la documentación de este archivo.
1 <?php
25 require CORE_PATH . 'kumbia/util.php';
29 require CORE_PATH . 'kumbia/kumbia_exception.php';
33 require CORE_PATH . 'kumbia/config.php';
37 require CORE_PATH . 'kumbia/load.php';
38 
49 class Console
50 {
51 
59  private static function _getConsoleArgs($argv)
60  {
61  $args = array(array());
62 
63  foreach ($argv as $p) {
64  if (is_string($p) && preg_match("/--([a-z_0-9]+)[=](.+)/", $p, $regs)) {
65  // carga en el array de parametros nombrados
66  $args[0][$regs[1]] = $regs[2];
67  } else {
68  // lo carga como argumento simple
69  $args[] = $p;
70  }
71  }
72 
73  return $args;
74  }
75 
83  public static function load($console_name)
84  {
85  // nombre de la clase de consola
86  $Console = Util::camelcase($console_name) . 'Console';
87 
88  if (!class_exists($Console)) {
89  // intenta carga el archivo de consola
90  $file = APP_PATH . "extensions/console/{$console_name}_console.php";
91 
92  if (!is_file($file)) {
93  $file = CORE_PATH . "console/{$console_name}_console.php";
94 
95  if (!is_file($file)) {
96  throw new KumbiaException('Consola "' . $file . '" no se encontro');
97  }
98  }
99 
100  // incluye la consola
101  include_once $file;
102  }
103 
104  // crea la instancia de objeto
105  $console = new $Console();
106 
107  // inicializa la consola
108  if (method_exists($console, 'initialize')) {
109  $console->initialize();
110  }
111 
112  return $console;
113  }
114 
121  public static function dispatch($argv)
122  {
123  // Elimino el nombre de archivo del array de argumentos
124  array_shift($argv);
125 
126  // obtiene el nombre de consola
127  $console_name = array_shift($argv);
128  if (!$console_name) {
129  throw new KumbiaException('No ha indicado la consola a ejecutar');
130  }
131 
132  // obtiene el nombre de comando a ejecutar
133  $command = array_shift($argv);
134  if (!$command) {
135  $command = 'main';
136  }
137 
138  // Obtiene los argumentos para la consola, el primer argumento
139  // es el array de parametros nombrados para terminal
140  $args = self::_getConsoleArgs($argv);
141 
142  // verifica el path de aplicacion
143  if (isset($args[0]['path'])) {
144  $dir = realpath($args[0]['path']);
145  if (!$dir) {
146  throw new KumbiaException("La ruta \"{$args[0]['path']}\" es invalida");
147  }
148  // elimina el parametro path del array
149  unset($args[0]['path']);
150  } else {
151  // obtiene el directorio de trabajo actual
152  $dir = getcwd();
153  }
154 
155  // define el path de la aplicacion
156  define('APP_PATH', rtrim($dir, '/') . '/');
157 
158  // lee la configuracion
159  $config = Config::read('config');
160 
161  // constante que indica si la aplicacion se encuentra en produccion
162  define('PRODUCTION', $config['application']['production']);
163 
164  // crea la consola
165  $console = self::load($console_name);
166 
167  // verifica que exista el comando en la consola
168  if (!method_exists($console, $command)) {
169  throw new KumbiaException("El comando \"$command\" no existe para la consola \"$console_name\"");
170  }
171 
172  // si se intenta ejecutar
173  if ($command == 'initialize') {
174  throw new KumbiaException("El comando initialize es un comando reservado");
175  }
176 
177  // verifica los parametros para la accion de consola
178  $reflectionMethod = new ReflectionMethod($console, $command);
179  if (count($args) < $reflectionMethod->getNumberOfRequiredParameters()) {
180  throw new KumbiaException("Número de parametros erroneo para ejecutar el comando \"$command\" en la consola \"$console_name\"");
181  }
182 
183  // ejecuta el comando
184  call_user_func_array(array($console, $command), $args);
185  }
186 
194  public static function input($message, $values=NULL)
195  {
196  // abre la entrada
197  $stdin = fopen('php://stdin', 'r');
198 
199  do {
200  // imprime el mensaje
201  echo $message;
202 
203  // lee la linea desde el terminal
204  $data = str_replace(PHP_EOL, '', fgets($stdin));
205  } while ($values && !in_array($data, $values));
206 
207  // cierra el recurso
208  fclose($stdin);
209 
210  return $data;
211  }
212 
213 }