run(); */ public function run () { global $argv; $launcher = $argv[0]; chdir (dirname ($argv[0])."/.."); array_shift ($argv); if (isset ($argv[0]) && $argv[0] === "-h") { echo "Execute in CLI a controller or a model (in expert mode)\n"; echo " $launcher -h : display this help\n"; echo " $launcher -list : display controllers\n"; echo " $launcher -expert -list : display controllers and models\n"; echo " $launcher -listmethods : \n"; echo " display the methods available the controller class\n"; echo " $launcher -expert -listmethods :\n"; echo " display the methods available the model or controller class\n"; echo " $launcher -listmethodsdetails : \n"; echo " display the methods available the controller class\n"; echo " $launcher -expert -listmethodsdetails :\n"; echo " display the methods available the model or controller class\n"; echo " $launcher [args]\n"; echo " execute the method with the provided args\n"; echo " $launcher -expert [args]\n"; echo " execute the method with the provided args\n"; echo "You can replace ONE arg by a dash (-) to read from stdin\n"; exit; } $EXPERT = FALSE; if (isset ($argv[0]) && $argv[0] === "-expert") { $EXPERT = TRUE; array_shift ($argv); } // List the controllers and the models if the expert mode is activated $files = glob ("controllers/*.php"); if ($EXPERT) $files = array_merge ($files, glob ("models/*.php")); if (count ($files) === 0 && $EXPERT === FALSE) die ("No controllers available in ".getcwd()."\n"); if (count ($files) === 0 && $EXPERT === TRUE) die ("No controllers/models available in ".getcwd()."\n"); foreach ($files as $file) $classes[$file] = substr (strstr ($file, "_"), 1, -4); if (isset ($argv[0]) && $argv[0] === "-list") { // Lists the classes available in controllers and models if expert mode echo "List of classes available :\n"; echo " ".implode ("\n ", $classes)."\n"; echo "Usage : ".$launcher; if ($EXPERT) echo " -expert"; echo " -listmethods \n"; exit; } if (isset ($argv[0]) && $argv[0] === "-listmethods" || isset ($argv[0]) && $argv[0] === "-listmethodsdetails") { // Lists the methods of a class if (!isset ($argv[1])) die ("Missing parameter 'class'\n"); $class = $argv[1]; if (!in_array ($class, $classes)) die ("Unknown class '$class'\n"); $file = reset (array_keys ($classes, $class)); require_once ($file); $refclass = new ReflectionClass ($class); $methods = $refclass->getMethods(); echo "List of methods available in the class '$class' :\n"; foreach ($methods as $key=>$method) { if ($key > 0) echo "\n"; echo " ".$method->name; $r = new ReflectionMethod ($class, $method->name); $params = $r->getParameters(); foreach ($params as $param) { echo " "; if ($param->isOptional()) echo "["; else echo " <"; echo $param->name; if ($param->isOptional()) echo "]"; else echo ">"; } if ($argv[0] === "-listmethodsdetails") { echo "\n"; echo trim (substr ($method->getDocComment(), 3, -2)); } echo "\n"; } exit; } // Execution of the class->method if (!isset ($argv[0])) die ("No class to execute provided\n"); $class = $argv[0]; if (!in_array ($class, $classes)) die ("Unknown class '$class'\n"); array_shift ($argv); $file = reset (array_keys ($classes, $class)); require_once ($file); if (!isset ($argv[0])) die ("No method for class '$class' to execute\n"); $method = $argv[0]; array_shift ($argv); $refclass = new ReflectionClass ($class); $methods = $refclass->getMethods(); $found = FALSE; foreach ($methods as $meth) { if ($meth->name === $method) { $found = TRUE; break; } } if ($found === FALSE) die ("Method '$method' not available in class '$class'\n"); $r = new ReflectionMethod ($class, $method); $min = 0; $max = 0; $params = $r->getParameters(); foreach ($params as $param) { if (!$param->isOptional()) $min++; $max++; } if (count ($argv) < $min) die ("Not enough parameters provided to method\n"); if (in_array ("-", $argv)) { $key = reset (array_keys ($argv, "-")); $argv[$key] = file_get_contents ("php://stdin"); } // TODO : Manage a parameter in the constructor of the class $r = new $class; switch (count ($argv)) { case 0: $s=$r->$method(); break; case 1: $s=$r->$method($argv[0]); break; case 2: $s=$r->$method($argv[0], $argv[1]); break; case 3: $s=$r->$method($argv[0], $argv[1], $argv[2]); break; case 4: $s=$r->$method($argv[0], $argv[1], $argv[2], $argv[3]); break; case 5: $s=$r->$method($argv[0], $argv[1], $argv[2], $argv[3], $argv[4]); break; default: die ("Too much parameter on the method to be used in CLI\n"); } var_dump ($s); exit; } }