patinthehat / glacier
轻量级PHP控制台应用程序框架
Requires
- php: >=7.1.0
This package is not auto-updated.
Last update: 2024-09-29 06:02:40 UTC
README
一个轻量级的框架,可以快速构建PHP CLI脚本和应用程序。
使用composer安装
composer require patinthehat/glacier
事件
Glacier 允许您使用 Events
和 EventListeners
很容易地编写事件驱动应用程序。
自定义事件扩展 Event
类,名称自动生成。事件名称通过在每个大写字母前插入点(除了第一个)并将所有内容转换为小写来生成。例如,"MyEvent123" 将触发 "my.event123" 事件。
事件可以这样定义
class MyEvent1 extends Event { }
属性等可以按需添加。
要触发事件,请调用 event()
event(new MyEvent1)
您还可以通过传递第二个可选参数与事件一起发送有效负载
event(new MyEvent1, "my custom payload");
事件监听器
事件由事件监听器处理,应用程序 自动注册 事件监听器。除了定义一个 EventListener
或 MultipleEventListener
类之外,无需采取任何行动。要禁用此行为,将属性 $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