asar/silly

此包最新版本(dev-master)没有可用的许可信息。

Silly 是一个基于 PHP 的工具,用于快速创建命令行脚本。

dev-master 2012-12-20 04:21 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:18:01 UTC


README

此文档可在 Silly PHP CLI 网站 找到。

Silly: 这是个简单的 CLI 工具

Silly 是一个基于 PHP 的工具,用于快速创建命令行脚本。

Silly 使创建命令行脚本变得像编写 PHP 类定义一样简单。它如此简单,简直可笑!

要求

  • PHP 5.3+
  • PHP CLI

快速指南

安装

通过 Pear

$ pear channel-discover pear.brainchildprojects.org
$ pear install brainchild/Silly

或克隆源代码

$ git clone git://github.com/asartalo/Silly.git

编写任务

<?php
// my-silly-test.php
require_once 'Silly\Silly.php'; // or wherever you placed Silly

// Define some tasks
class MyCoolTasks implements \Silly\Tasks
{
    private $controller;

    function getTaskNamespace() {
        return '';
    }

    function setController(\Silly\Controller $controller) {
        $this->controller = $controller;
    }

    function taskSayHello() {
        $this->controller->out('Hello!');
    }
}

// Get the silly little controller
$controller = \Silly\Silly::getController(new MyCoolTasks);
// Okay, run it!
$controller->execute($argv);

运行!

$ php my-silly-test.php say-hello
Hello!

任务

脚本命令在任务列表中定义。任务列表是一个实现 Silly\Tasks 接口的 PHP 类,该接口定义了一个获取控制器对象(Silly\Controller)的方法,以及一个设置任务列表命名空间的方法。注册任务时,在执行任何任务方法之前,控制器都会被传递。

<?php
use Silly\Tasks;

// A sample task list
class FooTasks implements Tasks {

    private $controller;

    function getTaskNamespace() {
        return '';
    }

    function setController(Silly\Controller $controller) {
        $this->controller = $controller;
    }

    function taskFoo() {
        $this->controller->out('foo');
    }
}

为了有效,任务列表需要定义一些任务方法。这些方法只是以 'task' 开头的公共方法。例如,要定义一个 'foo' 任务

<?php
use Silly\Tasks;

// A sample task list
class FooTasks implements Tasks {

    //...snip...//

    function taskFoo() {
        $this->controller->out('foo');
    }

    function taskFooBar() {
        $this->controller->out('foo-bar');
    }
}

在上述示例中,您可以在终端中输入 taskFoo 来调用

$ myscript.php foo

您也可以通过以下方式调用 taskFooBar

$ myscript.php foo-bar

如果您想向任务方法传递一些参数,只需将它们定义为方法参数。

<?php
use Silly\Tasks;

// A sample task list
class FooTasks implements Tasks {

    //...snip...//

    function taskHello($name) {
        $this->controller->out("Hello $name!");
    }
}
$ myscript.php hello Guwapo
Hello Guwapo!

请注意,任务方法只能从 CLI 获取标量值。另外,没有参数验证,所以不向 hello 任务传递参数将引发一些 InvalidArgument 异常或类似错误。

您想要带标志的吗?

有时您可能希望传递一些标志来修改任务的行为。可以通过编写以 'flag' 开头的标志方法来定义标志。例如

<?php
use Silly\Tasks;

class FooTasks implements Tasks {

    private $suffix = '';
    private $annoy;

    //...snip...//

    function taskFoo() {
        $output = "Foo{$this->suffix}";
        if ($this->annoy) {
            for ($i=0; $i < 3; $i++) {
                $output .= $output;
            }
        }
        $this->controller->out($output);
    }

    function flagSuffix($suffix) {
        $this->suffix = $suffix;
    }

    function flagAnnoyMe() {
        $this->annoy = true;
    }

}
$ myscript.php foo
Foo
$ myscript.php foo --suffix Bar
FooBar
$ myscript.php foo --suffix Bar --annoy-me
FooBar
FooBar
FooBar
FooBar

命名空间

当您有很多任务时,将这些任务分组到命名空间中是一个很好的管理方法。每个任务列表都可以指定一个命名空间。要设置任务列表的命名空间,必须返回命名空间,即 Tasks::getTaskNamespace()。例如...

<?php
use Silly\Tasks;

class FooTasks implements Tasks {
    //...snip...//

    function getTaskNamespace() {
        return ''; // This is the default namespace
    }

    function taskFoo() {
        $this->controller->out('Foo!');
    }

}

class BarTasks implements Tasks {
    //...snip...//

    function getTaskNamespace() {
        return 'bar';
    }

    function taskFoo() {
        $this->controller->out('Bar!');
    }
}

$controller = \Silly\Silly::getController(new FooTasks); // this registers FooTasks
$contorller->register(new BarTasks)
// Okay, run it!
$controller->execute($argv);
$ myscript.php foo
Foo!
$ myscript.php bar:foo
Bar!

路线图

  • 参数验证
  • 添加快捷标志如 -f -s
  • 通过文档注释添加文档