PHP CLI APP
documentation:
English
Simple and easy library for rapid development of command line applications in php.
Php version> = 7.1
Installation
composer require --prefer-dist alexp007/cli
Fast start
Remember to include composer autoloader, like this:
require __DIR__ . "/../vendor/autoload.php"; // path to autoload.php
then
use Cli\Basic\Cli;
Cli::initialize([
'script_file_name' => 'cli.php' // Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°
]);
Cli::handle('sayHi', function ($name) { // callable
return "hi " . $name;
});
Cli::run();
now command can be used via cli:
php cli.php sayHi pete
the result of the execution will be:
hi pete
Creating commands
You can create any number of commands using:
Cli::handle($commandName, $callable)
- $commandName - (string) command name
- $callable - (callable) any valid php callback, if you need to pass a static class method then ['Class', 'MethodName']
Extended syntax looks like this:
Cli::handle(string $command, callable $callback, array $flags = array(), array $env = array())
- $flags - (array) allowed flags used with the command, for example ['-r', '--name']
- $env - (array) environment variables: any data that should be available inside $callback (used to avoid global dependencies). Global variables will be overwritten
Extended command declaration example:
use Cli\Basic\Cli;
use Cli\Basic\Flags;
use Cli\Basic\Environment;
Cli::handle('sayHi', function ($name, Flags $flags, Environment $env) { // callable
if ($flags->getFlag('--send')) {
return "mail sent to administrator" . $env->getEnv('email');
}
return "hi " . $name;
}, ['--send'], ['email' => 'name@mail.ru']);
If you want to use Flags and Environment, then specifying the data type in the arguments is mandatory.
This library strictly refers to the arguments of commands, which means a command that expects a single argument cannot be called without it. However, if the argument is optional, then when creating the function, you should specify the default value for the argument null, for example:
Cli::handle('sayHi', function ($name = null) {
return 'hi';
});
If you expect a variable number of arguments, then you are prompted to use a Params object:
use Cli\Basic\Cli;
use Cli\Basic\Params;
Cli::handle('bit', function(Params $params){
$allParams = $params->getArray();
return join(',', $allParams);
});
When using special objects (Params, Flags, Environment) as arguments, their order does not matter:
use Cli\Basic\Cli;
use Cli\Basic\Flags;
use Cli\Basic\Params;
use Cli\Basic\Environment;
Cli::handle('sayHi', function (Flags $flags, Environment $env, Params $params) { // callable
return $params;
}, ['--send'], ['email' => 'name@mail.ru']);
Any other arguments should be specified before special ones.
Fundamental rules
-
When invoking a command from a command line, flags must be passed before arguments, for example:
php cli.php sayHi -f pete
-
You can use flags with the prefixes "-" or "--"
-
Together with flags, you can pass their value through "="
php cli.php sayHi --mail=pete@mail.ru pete
-
If the flag is used without a value, then it will be set to the default value in the Flags object in true
php cli.php sayHi -f pete
-f will be true
-
The library will not allow the use of flags that were not specified when creating the command, for example, for the next commands, it will not be possible to use the "-r" flag:
Cli::handle('sayHi', function ($name) { return "hi " . $name; }, [-f]);
-
Also, the library strictly refers to the number of arguments of a command (see above in the section "Creating Commands")
-
Also in the system there cannot be two command with the same name. The library is closely following this =)
Special Objects
Params
Params::getParam(int $n) - where $n is position
Params::getArray(): array // all params
Flags
Flags::getFlag(string $flag)
Flags::getArray(): array // all flags
Environment
Environment::getEnv(string $key)
Environment::getArray(): array // all environment vars
Configuration
When initializing the application, you can set configuration settings, here is an example:
Cli::initialize([
'script_file_name' => 'cli.php',
'enable_list' => 'on',
'enable_exceptions' => 'on',
'enable_errors' => 'on',
'enable_find_command_package' => 'on',
]);
- script_file_name - the name of the file in which the library is connected - required
- enable_list - allows the use of listing (built-in command that displays a list of all available commands)
- enable_exceptions - includes exceptions and explanations from the library (always recommended)
- enable_errors - enables errors (it is recommended to enable only during debugging)
- enable_find_command_package - enables a package of built-in search commands
You could set global variables by passing them as the second parameter. They will be available within special object Environment inside commands
Aliases
When passing environment variables, you can use aliases using the @ special character. The alias will be interpolated within the string, for example:
Cli::initialize([
'script_file_name' => 'cli.php',
], [
'object' => 'ufo',
'article_name' => '@object is flying in the sky'
]);
The article_name value will be: "ufo is flying in th sky"
Built-in Commands
list (if 'enable_list' => 'on') allows you to use the built-in list command, which lists all teams registered in the system and brief information about them:
php cli.php list
will return:
+-------------+---------------+------------------+
| Command | Params | Flags |
+-------------+---------------+------------------+
| bit | | |
| find:file | path, pattern | -r |
| find:inFile | path, pattern | -r, --extensions |
| list | | |
| sayHi | | --send |
| table | | |
+-------------+---------------+------------------+
find:file [path to the search directory] [pattern - regular expression] -> search for files in the system.
You can use the "-r" flag to recursively search subdirectories:
php cli.php find:file ./ "php"
will find files with php extension:
+--------------+----------------+
| Filename | Filepath |
+--------------+----------------+
| autoload.php | ./autoload.php |
| cli.php | ./cli.php |
+--------------+----------------+
find:inFile [path to the search directory] [pattern - regular expression] -> search for matches in files.
You can use the -r flag to recursively search subdirectories and the β--extensionsβ flag indicates the exact extensions, separated by commas (only these files will be searched):
php cli.php find:inFile --extensions=php ./ "include"
will return
+--------------------------------+------+----------+-----------+
| Match | Line | Filename | Filepath |
+--------------------------------+------+----------+-----------+
| include_once "src/$class.php"; | 12 | cli.php | ./cli.php |
+--------------------------------+------+----------+-----------+
To use the find package commands, you need to set 'enable_find_command_package' => 'on' in the configuration.
Formatter
A class that simplifies the work with outputting the result:
use Cli\Basic\Formatter;
Output color red:
Formatter::red() : $this
Output color blue:
Formatter::blue() : $this
Output color red:
Formatter::yellow() : $this
Table view:
Formatter::asTable(): $this
Line break:
Formatter::line() : $this
Prints to output stream:
Formatter::printOut()
Creating a new Formatter (you can pass an array or a string):
new Formatter(array or string $data)
Special objects (Params, Flags, Environment) can be passed without additional adaptation:
use Cli\Basic\Cli;
use Cli\Basic\Formatter;
Cli::handle('bit', function(Params $params){
$fmt = new Formatter($params);
return $fmt->blue();
});
Example table output:
use Cli\Basic\Cli;
use Cli\Basic\Formatter;
Cli::handle('table', function() {
$data = [
['command_1', 'params', 'flags'],
['command_2', '[1,34,56,]', '[-f -r -d]'],
['special_command', '[1,string,56,]', '[-f -r -d]'],
];
$fmt = new Formatter($data);
return $fmt->asTable()->red();
});
Successful development to you!
Write to me with any questions or suggestions to alex.p.panteleev@gmail.com, as well as create issues.
Contributors welcome!
Russian
ΠΡΠΎΡΡΠ°Ρ ΠΈ Π»Π΅Π³ΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΡΠΊΠΎΡΠΎΡΡΠ½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π½Π° php.
ΠΠ΅ΡΡΠΈΡ php >= 7.1
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
composer require --prefer-dist alexp007/cli
ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ
ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π°Π²ΡΠΎΠ·Π°Π³ΡΡΠ·ΡΠΈΠΊ composer, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊ:
require __DIR__ . "/../vendor/autoload.php"; // ΠΏΡΡΡ Π΄ΠΎ Π°Π²ΡΠΎΠ·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ°
Π΄Π°Π»Π΅Π΅
use Cli\Basic\Cli;
Cli::initialize([
'script_file_name' => 'cli.php' // Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°
]);
Cli::handle('sayHi', function ($name) { // callable
return "hi " . $name;
});
Cli::run();
Π·Π°ΡΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅:
php cli.php sayHi pete
ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ:
hi pete
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π»ΡΠ±ΠΎΠ΅ ΠΊΠΎΠ»-Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ:
Cli::handle($commandName, $callable)
- $commandName - (string) Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
- $callable - (callable) Π»ΡΠ±ΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π½ΡΠΉ php ΠΊΠΎΠ»Π±ΡΠΊ, Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ° ΡΠΎ ['Class', 'MethodName']
Π Π°ΡΡΠΈΡΠ΅Π½Π½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
Cli::handle(string $command, callable $callback, array $flags = array(), array $env = array())
- $flags - (array) ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΠ΅ ΡΠ»Π°Π³ΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ['-r', '--name']
- $env - (array) ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ: Π»ΡΠ±ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π²Π½ΡΡΡΠΈ $callback (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ, ΡΡΠΎΡ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π³Π»ΠΎΠ±Π°Π»Π½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ). ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠ°Π½Ρ
Π Π°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
use Cli\Basic\Cli;
use Cli\Basic\Flags;
use Cli\Basic\Environment;
Cli::handle('sayHi', function ($name, Flags $flags, Environment $env) { // callable
if ($flags->getFlag('--send')) {
return "mail sent to administrator" . $env->getEnv('email');
}
return "hi " . $name;
}, ['--send'], ['email' => 'name@mail.ru']);
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Flags ΠΈ Environment, ΡΠΎ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ Π² Π°Π³ΡΡΠΌΠ΅Π½ΡΠ°Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ.
ΠΠ°Π½Π½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΡΡΠΎΠ³ΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄, ΡΡΠΎ Π·Π½Π°ΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΎΠΆΠΈΠ΄Π°ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, Π½Π΅Π»ΡΠ·Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°ΡΡ Π±Π΅Π· Π½Π΅Π³ΠΎ. ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ, ΡΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° null, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
Cli::handle('sayHi', function ($name = null) {
return 'hi';
});
ΠΡΠ»ΠΈ Π²Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², ΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Params:
use Cli\Basic\Cli;
use Cli\Basic\Params;
Cli::handle('bit', function(Params $params){
$allParams = $params->getArray();
return join(',', $allParams);
});
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (Params, Flags, Environment) Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ:
use Cli\Basic\Cli;
use Cli\Basic\Flags;
use Cli\Basic\Params;
use Cli\Basic\Environment;
Cli::handle('sayHi', function (Flags $flags, Environment $env, Params $params) { // callable
return $params;
}, ['--send'], ['email' => 'name@mail.ru']);
ΠΡΠ±ΡΠ΅ ΠΎΠ±ΡΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π΄ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ .
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π°
-
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΡΠ»Π°Π³ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ Π΄ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
php cli.php sayHi -f pete
-
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π°Π³ΠΈ Ρ ΠΏΡΠ΅ΡΠΈΠΊΡΠ°ΠΌΠΈ "-" ΠΈΠ»ΠΈ "--"
-
ΠΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ»Π°Π³Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· "="
php cli.php sayHi --mail=pete@mail.ru pete
-
ΠΡΠ»ΠΈ ΡΠ»Π°Π³ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±Π΅Π· Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠΎ Π΅ΠΌΡ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ Flags Π² true
php cli.php sayHi -f pete
-f Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π½ΠΎ true
-
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π°Π³ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½Ρ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π½Π΅Π»ΡΠ·Ρ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π°Π³ "-r":
Cli::handle('sayHi', function ($name) { return "hi " . $name; }, [-f]);
-
Π’Π°ΠΊ ΠΆΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΡΡΠΎΠ³ΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΊΠΎΠ»-Π²Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ (ΡΠΌ.Π²ΡΡΠ΅ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ "Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄")
-
Π’Π°ΠΊ ΠΆΠ΅ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄Π²ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° ΡΡΠΈΠΌ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ =)
Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ
Params
Params::getParam(int $n) - where $n is position
Params::getArray(): array // all params
Flags
Flags::getFlag(string $flag)
Flags::getArray(): array // all flags
Environment
Environment::getEnv(string $key)
Environment::getArray(): array // all environment vars
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
ΠΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅Ρ Π½Π°ΡΡΡΠΎΠ΅ΠΊ:
Cli::initialize([
'script_file_name' => 'cli.php',
'enable_list' => 'on',
'enable_exceptions' => 'on',
'enable_errors' => 'on',
'enable_find_command_package' => 'on',
]);
- script_file_name - ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π±ΠΈΠ»ΠΈΠΎΡΠ΅ΠΊΠ° - ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°
- enable_list - ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π»ΠΈΡΡΠΈΠ½Π³Π° (Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π²ΡΠ²ΠΎΠ΄ΡΡΠ°Ρ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄)
- enable_exceptions - Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΡ ΠΎΡ Π±ΠΈΠ»ΠΈΠΎΡΠ΅ΠΊΠΈ (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π²ΡΠ΅Π³Π΄Π°)
- enable_errors - Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠΈ (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅)
- enable_find_command_package - ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΠ°ΠΊΠ΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΠΎΠΈΡΠΊΠ°
Π’Π°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π²ΡΠΎΡΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ Environment Π²Π½ΡΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄:
Cli::initialize([
'script_file_name' => 'cli.php',
], [
'custom_var' => 'value' // Π»ΡΠ±ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ
]
);
ΠΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ
ΠΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° @. ΠΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠΏΠΎΠ»ΠΈΡΠΎΠ²Π°Π½ Π²Π½ΡΡΡΠΈ ΡΡΡΠΎΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
Cli::initialize([
'script_file_name' => 'cli.php',
], [
'object' => 'ufo',
'article_name' => '@object is flying in the sky'
]);
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ article_name Π±ΡΠ΄Π΅Ρ: "ufo is flying in th sky"
ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
list (Π΅ΡΠ»ΠΈ 'enable_list' => 'on') ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ list, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΊΡΠ°ΡΠΊΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½ΠΈΡ :
php cli.php list
Π²Π΅ΡΠ½Π΅Ρ:
+-------------+---------------+------------------+
| Command | Params | Flags |
+-------------+---------------+------------------+
| bit | | |
| find:file | path, pattern | -r |
| find:inFile | path, pattern | -r, --extensions |
| list | | |
| sayHi | | --send |
| table | | |
+-------------+---------------+------------------+
find:file [ΠΏΡΡΡ ΠΊ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ°] [ΠΏΠ°ΡΡΠ΅ΡΠ½ - ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅] -> ΠΏΠΎΠΈΡΠΊ ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π°Π³ "-r" Π΄Π»Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° Π² ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡ :
php cli.php find:file ./ "php"
Π½Π°ΠΉΠ΄Π΅Ρ ΡΠ°ΠΉΠ»Ρ c ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ php:
+--------------+----------------+
| Filename | Filepath |
+--------------+----------------+
| autoload.php | ./autoload.php |
| cli.php | ./cli.php |
+--------------+----------------+
find:inFile [ΠΏΡΡΡ ΠΊ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ°] [ΠΏΠ°ΡΡΠ΅ΡΠ½ - ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅] -> ΠΏΠΎΠΈΡΠΊ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ Π²Π½ΡΡΡΠΈ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π°Π³ "-r" Π΄Π»Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° Π² ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡ ΠΈ ΡΠ»Π°Π³ "--extensions" Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΠΎΡΠ½ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ, ΡΠ΅ΡΠ΅Π· Π·Π°ΠΏΡΡΡΡ (ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ ΠΏΠΎΠΈΡΠΊ):
php cli.php find:inFile --extensions=php ./ "include"
Π²Π΅ΡΠ½Π΅Ρ:
+--------------------------------+------+----------+-----------+
| Match | Line | Filename | Filepath |
+--------------------------------+------+----------+-----------+
| include_once "src/$class.php"; | 12 | cli.php | ./cli.php |
+--------------------------------+------+----------+-----------+
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΠ°ΠΊΠ΅ΡΠ° find Π½ΡΠΆΠ½ΠΎ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ 'enable_find_command_package' => 'on'.
Formatter
ΠΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°:
use Cli\Basic\Formatter;
Π¦Π²Π΅Ρ Π²ΡΠ²ΠΎΠ΄Π° ΠΊΡΠ°ΡΠ½ΡΠΉ:
Formatter::red() : $this
Π¦Π²Π΅Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΈΠ½ΠΈΠΉ:
Formatter::blue() : $this
Π¦Π²Π΅Ρ Π²ΡΠ²ΠΎΠ΄Π° ΠΊΡΠ°ΡΠ½ΡΠΉ:
Formatter::yellow() : $this
Π’Π°Π±Π»ΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅:
Formatter::asTable(): $this
ΠΠ΅ΡΠ΅Π½ΠΎΡ ΡΡΡΠΎΠΊΠΈ:
Formatter::line() : $this
ΠΠ΅ΡΠ°ΡΠ°Π΅Ρ Π² ΠΏΠΎΡΠΎΠΊ Π²ΡΠ²ΠΎΠ΄Π°:
Formatter::printOut()
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Formatter(ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ² ΠΈΠ»ΠΈ ΡΡΡΠΎΠΊΡ):
new Formatter(array or string $data)
Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ (Params, Flags, Environment) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π±Π΅Π· ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ:
use Cli\Basic\Cli;
use Cli\Basic\Formatter;
Cli::handle('bit', function(Params $params){
$fmt = new Formatter($params);
return $fmt->blue();
});
ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ²ΠΎΠ΄Π°:
use Cli\Basic\Cli;
use Cli\Basic\Formatter;
Cli::handle('table', function() {
$data = [
['command_1', 'params', 'flags'],
['command_2', '[1,34,56,]', '[-f -r -d]'],
['special_command', '[1,string,56,]', '[-f -r -d]'],
];
$fmt = new Formatter($data);
return $fmt->asTable()->red();
});
Π£ΡΠΏΠ΅ΡΠ½ΠΎΠΉ Π²Π°ΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ!
ΠΠΈΡΠ΅ΡΠ΅ ΠΌΠ½Π΅ Ρ Π»ΡΠ±ΡΠΌΠΈ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌΠΈ ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ Π½Π° alex.p.panteleev@gmail.com, Π° ΡΠ°ΠΊ ΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ issues.
ΠΡΠ΅ΠΌ ΠΆΠ΅Π»Π°ΡΡΠΈΠΌ ΠΊΠΎΠ½ΡΡΠΈΠ±ΡΡΡΠΈΡΡ - Π΄ΠΎΠ±ΡΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°ΡΡ!