patinthehat/glacier

轻量级PHP控制台应用程序框架

0.1.7 2017-12-13 23:11 UTC

This package is not auto-updated.

Last update: 2024-09-29 06:02:40 UTC


README

一个轻量级的框架,可以快速构建PHP CLI脚本和应用程序。

使用composer安装

composer require patinthehat/glacier

事件

Glacier 允许您使用 EventsEventListeners 很容易地编写事件驱动应用程序。

自定义事件扩展 Event 类,名称自动生成。事件名称通过在每个大写字母前插入点(除了第一个)并将所有内容转换为小写来生成。例如,"MyEvent123" 将触发 "my.event123" 事件。

事件可以这样定义

class MyEvent1 extends Event { }

属性等可以按需添加。

要触发事件,请调用 event()

event(new MyEvent1)

您还可以通过传递第二个可选参数与事件一起发送有效负载

event(new MyEvent1, "my custom payload");

事件监听器

事件由事件监听器处理,应用程序 自动注册 事件监听器。除了定义一个 EventListenerMultipleEventListener 类之外,无需采取任何行动。要禁用此行为,将属性 $autoRegister 设置为 false

public static $autoRegister = false;

可以定义处理事件 'my.event1' 和 'my.event2' 的事件监听器

class MyEventListener1 extends EventListener
{
    public static $events = [ 'my.event1', 'my.event2' ];

    public function handle($event, $payload = null)
    {
        app()->output()->write('[event fired] '.$event->name . PHP_EOL);
        return true;
    }

要监听所有事件,应将事件名称定义为 '*'

    public static $events = [ '*' ];

命令

Glacier 允许在同一应用程序内支持多个命令。要创建命令,扩展 Command

class MyCommand extends Command
{
    public static $autoRegister = true;
    public $name = 'mycmd';

    public function execute()
    {
	    $this->app->output()->writeln('my command!');
    }
}

默认情况下,所有命令 都是自动注册的。要禁用此行为,将静态属性 $autoRegister 设置为 false

    public static $autoRegister = false;

如果禁用了自动注册,请在调用 $app->run() 之前注册它

$app->registerCommand(new MyCommand);

默认命令

  • 待定

命令行参数

Glacier 默认接受所有命令行标志。要接受带值的标志,必须在 arguments() 方法的 defineOption() 方法中调用。定义完选项后,必须调用 parse()

一旦定义,即使提供了简短标志,也可以通过调用 setting($name) 访问其值,例如 setting('test'),即使命令行上传递了 -t 55

要定义命令行选项,请使用以下格式

defineOption(shortflag, long-flag, expects-value, default-value)

例如

defineOption('t', 'test', true, 0)

完整地定义命令行选项

$app->arguments()
    ->defineOption('t', 'test', true, 0)
    ->defineOption('a', 'all', false, false)
    ->defineOption('c', 'count', true, 10)
    ->parse();

这必须在调用 $app->run() 之前完成。

这里定义的任何设置都可以稍后引用,例如,作为 setting('count')setting('all')

如果您只想能够处理没有值的标志,则不需要调用 defineOption()。要访问,只需引用 app()->arguments()->hasOption('myflag')

  if (app()->arguments()->hasOption('quiet')) { ...

配置文件

  • 待定

一个基本应用程序

require(__DIR__.'/vendor/autoload.php');

use Glacier\Console\Application;
use Glacier\Console\DefaultCommand;
use Glacier\Events\Event;
use Glacier\Events\EventListener;
use Glacier\Events\MultipleEventListener;


class MyEvent1 extends Event { }
class MyEvent2 extends Event { }

//automatically registered with the application
class MyEventListener1 extends EventListener
{
    public static $events = [ 'my.event1', 'my.event2' ];

    public function handle($event, $payload = null)
    {
        app()->output()->write('[event fired] '.$event->name.'; listener: '.__CLASS__ . '; payload = '. (isset($payload->name) ? $payload->name : '') . PHP_EOL);
        return true;
    }
}

//automatically registered with the application
class MyEventListener3 extends MultipleEventListener
{
    public static $events = [ '*' ];
    protected $ignoreMissingHandlers = true;

    public function my_event1(Event $event, $payload = null)
    {
        echo '[1] hi from '.__CLASS__.': '.$event->name.PHP_EOL;
    }

    public function my_event2(Event $event, $payload = null)
    {
        echo '[2] hi from '.__CLASS__.': '.$event->name.PHP_EOL;
    }
}

class DemoCommand extends DefaultCommand
{
    public function initialize()
    {
       event(new MyEvent2);
    }

    public function execute()
    {
        event(new MyEvent1);
        app()->output()->writeln('hello from '.$this->getName());
    }

}

$app = new Application($argv,  __DIR__, true, false, [DemoCommand::class], false, false);

$app->arguments()
    ->defineOption('t', 'test', true, 0)
    ->parse();

$app->run();

执行: php myapp.php -t 55 php myapp.php --test=123

一个简单的Glacier应用程序

require(__DIR__.'/vendor/autoload.php');

use Glacier\Console\Application;
use Glacier\Console\DefaultCommand;

class DemoCommand extends DefaultCommand
{
    public $name = 'demo2';

    public function initialize()
    {
        //
    }

    public function execute()
    {
        if (app()->arguments()->hasOption('goodbye')) {
            app()->output()->writeln('goodbye from '.$this->getName());
        } else {
            app()->output()->writeln('hello from '.$this->getName());
        }
    }

}

$app = new Application($argv,  __DIR__, true, true, [DemoCommand::class], false, false);
$app->run();

执行: php myapp.php 然后 php myapp.php --goodbye