Completed
Push — 1.0 ( a4c55b...057858 )
by joanhey
02:35
created

Console::dispatch()   C

Complexity

Conditions 8
Paths 19

Size

Total Lines 65
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 28
nc 19
nop 1
dl 0
loc 65
rs 6.7651
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * KumbiaPHP web & app Framework
4
 *
5
 * LICENSE
6
 *
7
 * This source file is subject to the new BSD license that is bundled
8
 * with this package in the file LICENSE.txt.
9
 * It is also available through the world-wide-web at this URL:
10
 * http://wiki.kumbiaphp.com/Licencia
11
 * If you did not receive a copy of the license and are unable to
12
 * obtain it through the world-wide-web, please send an email
13
 * to [email protected] so we can send you a copy immediately.
14
 *
15
 * Manejador de consolas de KumbiaPHP
16
 *
17
 * @category   Kumbia
18
 * @package    Core
19
 * @copyright  Copyright (c) 2005 - 2016 Kumbia Team (http://www.kumbiaphp.com)
20
 * @license    http://wiki.kumbiaphp.com/Licencia     New BSD License
21
 */
22
/**
23
 * @see Util
24
 */
25
require CORE_PATH . 'kumbia/util.php';
26
/**
27
 * @see KumbiaException
28
 */
29
require CORE_PATH . 'kumbia/kumbia_exception.php';
30
/**
31
 * @see Config
32
 */
33
require CORE_PATH . 'kumbia/config.php';
34
/**
35
 * @see Load
36
 */
37
require CORE_PATH . 'kumbia/load.php';
38
39
/**
40
 * modificado por nelsonrojas
41
 * el problema: al usar console controller create produce un error en linea 85.
42
 *              no reconoce FileUtil
43
 * solucion: incluir la libreria con la linea siguiente
44
 */
45
require CORE_PATH . 'libs/file_util/file_util.php';
46
47
/**
48
 * Manejador de consolas de KumbiaPHP
49
 *
50
 * Consola para la creación de modelos.
51
 * Consola para la creación de controladores.
52
 * Consola para el manejo de cache.
53
 *
54
 * @category   Kumbia
55
 * @package    Core
56
 */
57
class Console
58
{
59
60
    /**
61
     * Genera la lista de argumentos para la consola, el primer argumento
62
     * retornado corresponde al array de parametros nombrados de terminal
63
     *
64
     * @param array $argv argumentos de terminal
65
     * @return array
66
     * */
67
    private static function _getConsoleArgs($argv)
68
    {
69
        $args = array(array());
70
71
        foreach ($argv as $p) {
72
            if (is_string($p) && preg_match("/--([a-z_0-9]+)[=](.+)/", $p, $regs)) {
73
                // carga en el array de parametros nombrados
74
                $args[0][$regs[1]] = $regs[2];
75
            } else {
76
                // lo carga como argumento simple
77
                $args[] = $p;
78
            }
79
        }
80
81
        return $args;
82
    }
83
84
    /**
85
     * Crea una instancia de la consola indicada
86
     *
87
     * @param string $console_name nombre de la consola
88
     * return object
89
     * @throw KumbiaException
90
     * */
91
    public static function load($console_name)
92
    {
93
        // nombre de la clase de consola
94
        $Console = Util::camelcase($console_name) . 'Console';
95
96
        if (!class_exists($Console)) {
97
            // intenta carga el archivo de consola
98
            $file = APP_PATH . "extensions/console/{$console_name}_console.php";
99
100
            if (!is_file($file)) {
101
                $file = CORE_PATH . "console/{$console_name}_console.php";
102
103
                if (!is_file($file)) {
104
                    throw new KumbiaException('Consola "' . $file . '" no se encontro');
105
                }
106
            }
107
108
            // incluye la consola
109
            include_once $file;
110
        }
111
112
        // crea la instancia de objeto
113
        $console = new $Console();
114
115
        // inicializa la consola
116
        if (method_exists($console, 'initialize')) {
117
            $console->initialize();
118
        }
119
120
        return $console;
121
    }
122
123
    /**
124
     * Despacha y carga la consola a ejecutar desde argumentos del terminal
125
     *
126
     * @param array $argv argumentos recibidos desde el terminal
127
     * @throw KumbiaException
128
     * */
129
    public static function dispatch($argv)
130
    {
131
        // Elimino el nombre de archivo del array de argumentos
132
        array_shift($argv);
133
134
        // obtiene el nombre de consola
135
        $console_name = array_shift($argv);
136
        if (!$console_name) {
137
            throw new KumbiaException('No ha indicado la consola a ejecutar');
138
        }
139
140
        // obtiene el nombre de comando a ejecutar
141
        $command = array_shift($argv);
142
        if (!$command) {
143
            $command = 'main';
144
        }
145
146
        // Obtiene los argumentos para la consola, el primer argumento
147
        // es el array de parametros nombrados para terminal
148
        $args = self::_getConsoleArgs($argv);
149
150
        // verifica el path de aplicacion
151
        if (isset($args[0]['path'])) {
152
            $dir = realpath($args[0]['path']);
153
            if (!$dir) {
154
                throw new KumbiaException("La ruta \"{$args[0]['path']}\" es invalida");
155
            }
156
            // elimina el parametro path del array
157
            unset($args[0]['path']);
158
        } else {
159
            // obtiene el directorio de trabajo actual
160
            $dir = getcwd();
161
        }
162
163
        // define el path de la aplicacion
164
        define('APP_PATH', rtrim($dir, '/') . '/');
165
166
        // lee la configuracion
167
        $config = Config::read('config');
168
169
        // constante que indica si la aplicacion se encuentra en produccion
170
        define('PRODUCTION', $config['application']['production']);
171
172
        // crea la consola
173
        $console = self::load($console_name);
174
175
        // verifica que exista el comando en la consola
176
        if (!method_exists($console, $command)) {
177
            throw new KumbiaException("El comando \"$command\" no existe para la consola \"$console_name\"");
178
        }
179
180
        // si se intenta ejecutar
181
        if ($command == 'initialize') {
182
            throw new KumbiaException("El comando initialize es un comando reservado");
183
        }
184
185
        // verifica los parametros para la accion de consola
186
        $reflectionMethod = new ReflectionMethod($console, $command);
187
        if (count($args) < $reflectionMethod->getNumberOfRequiredParameters()) {
188
            throw new KumbiaException("Número de parametros erroneo para ejecutar el comando \"$command\" en la consola \"$console_name\"");
189
        }
190
191
        // ejecuta el comando
192
        call_user_func_array(array($console, $command), $args);
193
    }
194
195
    /**
196
     * Lee un dato de entrada desde la consola
197
     *
198
     * @param string $message mensaje a mostrar
199
     * @param array $values array de valores validos para entrada
200
     * @return string Valor leido desde la consola
201
     * */
202
    public static function input($message, $values=NULL)
203
    {
204
        // abre la entrada
205
        $stdin = fopen('php://stdin', 'r');
206
207
        do {
208
            // imprime el mensaje
209
            echo $message;
210
211
            // lee la linea desde el terminal
212
            $data = str_replace(PHP_EOL, '', fgets($stdin));
213
        } while ($values && !in_array($data, $values));
214
215
        // cierra el recurso
216
        fclose($stdin);
217
218
        return $data;
219
    }
220
221
}
222