irfantoor/command

Create shell commands, using php


Keywords
php, command, shell
License
MIT

Documentation

IrfanTOOR\Command

Simplest way to make your console commands.

Note: Since the inclusion of irfantoor\terminal, your commands can be run through a browser as well.

Examples:

A simple command to say "Hello World!"" on command line. The default options of verbosity, version and help are defained by default. So you can do like:

$ php hello1.php --help
$ php hello1.php -V
$ php hello1.php -v

Note: If version is not provided while intialising, file named 'version' is searched in the parent directory where the /src directory is present, if found then its contents are used as version, or a default value of '0.1' is used. This is helpful if the version file is part of versioning system and is updated to the last version tag (ref: examples/hello6.php)

ref: examples/hello1.php

<?php
require dirname(__DIR__) . "/vendor/autoload.php";

use IrfanTOOR\Command;

$cmd = new Command([
    'name' => 'hello1.php', 
    'description' => 'hello world! of command', 
    'handler' => function($cmd){
        $cmd->writeln("Hello World!", "yellow");
    },
    'version' => '1.1'
);

$cmd->run();

A more complex example of a composite commmand is as follows:

Here the option greeting is optional, and the operand name is required.

ex:

$ php hello4.php hello world!
$ php hello4.php hello -g=Hi irfan
$ php hello4.php hello --greeting="Hi there," buddy

ref: examples/hello4.php

<?php

require dirname(__DIR__) . "/vendor/autoload.php";

use IrfanTOOR\Command;
use IrfanTOOR\Debug;
Debug::enable(1);

class HelloCommand extends Command
{
    function __construct()
    {
        parent::__construct([
            'name' => 'hello', 
            'description' => 'hello world! of command',
            'version' => '1.3',
        ]);
    }

    function init()
    {
        $this->addOption('g|greeting', 'Sets the greeting', 'Hello');
        $this->addArgument('name', 'Name to be greeted', self::ARGUMENT_OPTIONAL, 'World!');
    }

    function main()
    {
        $greeting = $this->getOption('greeting');
        $name = ucfirst($this->getArgument('name'));

        $this->writeln($greeting . " " . $name, "yellow");
    }
}

class CalCommand extends Command
{
    function __construct()
    {
        parent::__construct([
            'name' => 'cal', 
            'description' => 'prints a calendar', 
            'version' => '0.1'
        ]);
    }

    function main()
    {
        ob_start();
        system("cal");
        $output = ob_get_clean();
        $this->writeln($output, "yellow");
    }
}

$cmd = new Command([
    'name' => 'hello4',
    'description' => "Composit command",
    'version' => '1.4',
    'handler' => function($cmd) {
    }
]);

$cmd->addCommand(HelloCommand::class);
$cmd->addCommand(CalCommand::class);

$cmd->run();

If the default value of an option is not provided its assumed as integer and every of its presense as an option will add 1 to its current value, e.g: command -v # verbosity = 1 command -vv # verbosuty = 2

If the default value of an option is a string, whenever such option is used it must always be followed by its value. For example hello4.php with a greeting "Hi" can be used in this way:

php hello4.php hello -g Hi irfan
# or
php hello4.php hello --greeting "Hay you! cheers" man

The arguments can be parsed as a string in url, or can be POSTed:

$ php hello4.php -h
# http://localhost:8000/hello4.php?args=-h


$ php hello4.php hello -g Hi irfan

# args as string:
# http://localhost:8000/hello4.php?args=hello%20-g%20Hi%20irfan

# args as array
# http://localhost:8000/hello4.php?args[]=hello&args[]=-g&args[]=Hi&args[]=irfan

# args must be used as array, when args values has spaces e.g.:
# http://localhost:8000/hello4.php?args[]=hello&args[]=-g&args[]=Hay%20You!&args[]=young%20man

ex:

$ php hello5.php        
|  Error: Missing argument: required
                                            
$ php hello5.php -h
hello 2.0

test the required argument

usage: hello [options] [--] <required>

options:
 -h, --help     Displays help
 -V, --version  Displays version
     --ansi     force ANSI outupt
     --no-ansi  disable ANSI output
 -v, --verbose  Adds verbosity

arguments:
 required    its a required argument [required]

$ php hello5.php Hello
OK the required argument is: Hello