asika32764 / php-simple-console

Single file CLI framework to help you write build scripts.
https://packagist.org/packages/asika/simple-console
21 stars 1 forks source link
argument-parser argv cli cli-app cli-framework console console-application console-framework stdin

PHP Simple Console

Single file console framework to help you write build scripts.

Installation

Use composer:

composer require asika/simple-console

Or downlaod single file to use: Download Here

Getting Started

Use closure

#!/bin/sh php
<?php
// Include single file
include_once __DIR__ . '/Console.php';

// Or use composer
include_once __DIR__ . '/vendor/autolod.php';

$app = new \Asika\SimpleConsole\Console;

// Use closure
$app->execute(function (\Asika\SimpleConsole\Console $app)
{
    // PHP 5.3
    $app->out('Hello');

    // PHP 5.4 or higher use $this
    $this->out('Hello');

    // Return TRUE will auto convert to 0 exitcode.
    return true;
});

Or Create your own class.

class Build extends \Asika\SimpleConsole\Console
{
    protected $help = <<<HELP
[Usage] php build.php <version>

[Options]
    h | help   Show help information
    v          Show more debug information.
HELP;

    protected function doExecute ()
    {
        $this->out('Hello');

        // Return TRUE will auto convert to 0 exitcode.
        return true;
    }
}

$app = new Build;
$app->execute();

Show HELP

Add -h or --help to show usage, you can add custom usage to $this->help, or override $this->getHelp().

If you want to change h and help option, override $this->helpOptions = array('...').

Handle Error

Just throw Exception in doExecute(), Console will auto catch error.

throw new \RuntimeException('...');

Add -v to show backtrace if error.

Handle Wrong Arguments

Wrong Argument use \Asika\SimpleConsole\CommandArgsException

$arg = $this->getArgument(0);

if (!$arg)
{
    throw new \Asika\SimpleConsole\CommandArgsException('Please enter a name.');
}

Console will auto show help information.

[Warning] Please enter a name.

[Usage] console.php <name>

[Options]
    h | help   Show help info.
    v          Show more debug information.

Multiple Commands

Use delegate() to delegate to different methods.

//...

    protected function doExecute()
    {
        return $this->delegate($this->getArgument(0));
    }

    protected function foo()
    {
        $this->getArgument(1); // bar
    }

    protected function baz()
    {
        // ...
    }

Now you can add sub commands

php console.php foo bar
php console.php baz

If you want to strip first argument after delgated, you can follow this code:

$this->delegate(array_shift($this->args));

Now can use getArgument(0) in sub method and ignore the first command name.

The is another way:

$command = array_shift($this->args);

$this->delegate($command, ...$this->args);
protected function foo($first, $second = null)
{
}

API

getArgument($order[, $default = null])

$first = $this->getArgument(0, 'default value');

setArgument($order, $$value)

$this->setArgument(1, 'value');

getOption($name: array|string[, $default = null])

Get option --foo

$this->getOption('foo');

Get option -f or --foo, first match will return.

$this->getOption(array('f', 'foo'));

NOTE: -abc will convert to a => 1, b => 1, c => 1 And -vvv will convert to v => 3

setOption($name, $value)

Set otpion to toption list. $name also support array.

out($string[, $newline: bool = false])

Write to STDOUT,

$this->out('Hello')->out('World');

err($string[, $newline: bool = false])

Write to STDERR

$this->err('Hello')->err('World');

in($string[$default = null, $bool = false)

Ask a question, read from STDIN

$un = $this->in('Please enter username: ', 'default_name');

Read as boolean, add true to third argument:

$bool = $this->in('Are you sure? [Y/n]', [default true/false], true);

exec($cmd)

A proxy to execute a cmd by exec() and return value.

It will add a title >> {your command} before exec so you will know what has been executed.