隆重推出 minicli:一个面向 CLI 的 PHP 应用的微框架
0 C:\Users\user pc\Desktop\myapp\vendor\minicli\minicli\lib\Command\CommandName
1 C:\Users\user pc\Desktop\myapp\vendor\minicli\minicli\lib\Command\CommandRegi
2 C:\Users\user pc\Desktop\myapp\vendor\minicli\minicli\lib\Command\CommandRegi
3 C:\Users\user pc\Desktop\myapp\vendor\minicli\minicli\lib\Command\CommandRegi
4 C:\Users\user pc\Desktop\myapp\vendor\minicli\minicli\lib\App.php(66): Minicl
5 C:\Users\user pc\Desktop\myapp\vendor\minicli\minicli\lib\App.php(46): Minicl
php-tc
在之前的文章“构建 Minicli系列”中,我们演示了在 PHP 中为纯 CLI 应用程序引导一个无依赖微框架的步骤。
Minicli 最初是作为一项教育实验而创建的,同时也是一个轻便的基础模型,我可以将其用于自己的个人项目。我喜欢把它看作是我能搭建的最基本的单元,在此基础上我可以构建自己的玩具。
距离我上次分享这个系列的文章已经过去好几个月了,我一直不太愿意分享我的工作成果,因为它总感觉像是一个未完成的作品。但它最终会完成吗(或者说,会让人觉得完成了)?可能不会。Minicli 从一开始就是开源的,虽然我从未打算把它变成一个主流项目,但我认为它也能帮助那些有兴趣在命令行中构建简单程序,又不想被几十个外部依赖项搞得焦头烂额的人。
所以,我想正式向大家介绍Minicli,这是一个高度实验性的、无依赖的、面向 CLI 的 PHP 应用程序的微框架。
虽然我不提倡在应用程序中重复造轮子,但我认为应该有一个起点,它不需要十几个不同的库就能实现基本的命令解析和路由。从这个起点出发,你应该能够有意识地选择依赖哪些外部库。Minicli 就是我为了解决这个问题而开发的。
我目前用 Minicli 构建了以下项目:
Dolphin是一个命令行工具,用于从命令行管理 DigitalOcean droplet。
我的网站是一个静态内容CMS,内容来源于我的开发日志。我正在将其开源,作为一个名为Librarian(开发中)的独立项目。
在这篇文章中,你将学习如何使用 Minicli 在 PHP 中创建一个简单的 CLI 应用程序。
创建项目
你需要php-cli一个Composer才能开始使用。
创建一个新项目:
composer create-project --prefer-dist minicli/application myapp
安装完成后,您可以minicli使用以下命令运行:
cd myapp
./minicli
这将显示默认应用程序签名。
helpminicli 自带的命令(定义于 )会app/Command/Help/DefaultController.php自动生成可用命令树:
./minicli help
Available Commands
help
└──test
该help test命令(定义于[此处] app/Command/Help/TestController.php)显示了参数的回显测试:
./minicli help test user=erika name=value
Hello, erika!
Array
(
[user] => erika
[name] => value
)
创建你的第一个命令
创建命令最简单的方法是编辑minicli脚本,并通过以下方式在应用程序中将新命令定义为匿名函数registerCommand:
#!/usr/bin/php
<?php
if (php_sapi_name() !== 'cli') {
exit;
}
require __DIR__ . '/vendor/autoload.php';
use Minicli\App;
use Minicli\Command\CommandCall;
$app = new App();
$app->setSignature('./minicli mycommand');
$app->registerCommand('mycommand', function(CommandCall $input) {
echo "My Command!";
var_dump($input);
});
$app->runCommand($argv);
然后您可以使用以下命令执行新命令:
./minicli mycommand
使用命令控制器
要将命令组织成控制器,您需要使用命令命名空间。
假设你想创建一个名为 `<command_name>` 的命令hello。你应该首先在app/Commands`<folder_name>` 文件夹下创建一个新目录:
mkdir app/Commands/Hello
现在Hello这里是你的命令命名空间。在该目录下,你需要创建至少一个命令控制器。你可以从 `<commandController>` 开始DefaultController,当没有提供子命令时,它将被默认调用。
DefaultController这门课可能的样子是这样的:
<?php
namespace App\Command\Hello;
use Minicli\Command\CommandController;
class DefaultController extends CommandController
{
public function handle()
{
$this->getPrinter()->display("Hello World!");
}
}
该命令可通过以下方式使用:
./minicli hello
由于未提供子命令,因此推断您想要执行默认命令。该命令也可以这样调用:
./minicli hello default
命名空间内的其他任何命令控制器Hello都将以类似的方式可用。例如,假设您想要创建一个新的子命令,例如hello caps……
然后,您需要创建一个名为“”的新命令控制器CapsController:
<?php
namespace App\Command\Hello;
use Minicli\Command\CommandController;
class CapsController extends CommandController
{
public function handle()
{
$this->getPrinter()->display("HELLO WORLD!");
}
}
这条新命令将以如下方式提供:
./minicli hello caps
使用参数
Minicli 对命令调用参数使用了一些约定:
- 参数/实参:已解析的参数 - 来自 $argv 的任何非 a
key=value且非--flag. - 参数/参数集:键值对,例如
user=erika --标志:以例如`flags` 为前缀的单个参数--update
父CommandController类公开了一些方便的方法来处理命令调用参数。
例如,假设您想更新之前的hello命令,使其使用一个可选参数来指定要问候的人的姓名。
<?php
namespace App\Command\Hello;
use Minicli\Command\CommandController;
use Minicli\Input;
class HelloController extends CommandController
{
public function handle()
{
$name = $this->hasParam('user') ? $this->getParam('user') : 'World';
$this->getPrinter()->display(sprintf("Hello, %s!", $name));
}
}
现在,要使用该命令的自定义版本,您需要运行:
./minicli hello user=erika
你会得到如下输出:
Hello, erika!
CommandCall类方法
hasParam(string $key) : bool- 如果参数存在,则返回 true。getParam(string $key) : string- 返回一个参数,如果参数不存在则返回 null。hasFlag(string $key) : bool- 返回命令调用中是否传递了标志。
打印输出
该类CliPrinter提供了一些快捷方法,可以以各种颜色和样式打印消息。
它自带两个主题:regular和unicorn。这在应用程序引导配置数组中进行设置,默认情况下配置为使用regular主题。
public function handle()
{
$this->getPrinter()->info("Starting Minicli...");
if (!$this->hasParam('message')) {
$this->getPrinter()->error("Error: you must provide a message.");
exit;
}
$this->getPrinter()->success($this->getParam('message'));
}
CliPrinter类方法
display(string $message) : void- 显示以换行符括起来的消息。error(string $message) : void- 使用当前主题颜色,以换行符的形式显示错误消息。success(string $message) : void- 使用当前主题颜色,以换行符的形式显示成功消息。info(string $message) : void- 使用当前主题颜色,以换行符显示信息消息。newline() : void- 打印新行。format(string $message, string $style="default") : string- 返回具有所需样式的格式化字符串。out(string $message) : void- 打印一条消息。
总结
Minicli 目前还在开发中,但你已经可以将其用作一个极简的基础,在其基础上构建有趣的玩具项目和/或有用的命令行工具,如Dolphin。
以下是我想要用 Minicli 实现的一些想法,但目前还没有时间(如果有人能帮我实现这些想法,我绝对不会介意):
- 一款文字角色扮演游戏
- 一个推特机器人
- 一款用于查找 Twitter 互关用户的工具
- 一款基于命令行界面的问答游戏
如果您想试用 Minicli,请查看文档了解更多详情,如有任何疑问,欢迎留言 :)
文章来源:https://dev.to/erikaheidi/introducing-minicli-a-microframework-for-cli-centric-php-applications-44ik
