发布于 2026-01-06 5 阅读
0

介绍 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:一个面向 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(开发中)的独立项目。

eheidi.dev 的屏幕截图

在这篇文章中,你将学习如何使用 Minicli 在 PHP 中创建一个简单的 CLI 应用程序。

创建项目

你需要php-cli一个Composer才能开始使用。

创建一个新项目:

composer create-project --prefer-dist minicli/application myapp
Enter fullscreen mode Exit fullscreen mode

安装完成后,您可以minicli使用以下命令运行:

cd myapp
./minicli
Enter fullscreen mode Exit fullscreen mode

这将显示默认应用程序签名。

helpminicli 自带的命令(定义于 )app/Command/Help/DefaultController.php自动生成可用命令树:

./minicli help
Enter fullscreen mode Exit fullscreen mode
Available Commands

help
└──test

Enter fullscreen mode Exit fullscreen mode

help test命令(定义于[此处] app/Command/Help/TestController.php)显示了参数的回显测试:

./minicli help test user=erika name=value
Enter fullscreen mode Exit fullscreen mode
Hello, erika!

Array
(
    [user] => erika
    [name] => value
)
Enter fullscreen mode Exit fullscreen mode

创建你的第一个命令

创建命令最简单的方法是编辑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);
Enter fullscreen mode Exit fullscreen mode

然后您可以使用以下命令执行新命令:

./minicli mycommand
Enter fullscreen mode Exit fullscreen mode

使用命令控制器

要将命令组织成控制器,您需要使用命令命名空间

假设你想创建一个名为 `<command_name>` 的命令hello。你应该首先在app/Commands`<folder_name>` 文件夹下创建一个新目录:

mkdir app/Commands/Hello
Enter fullscreen mode Exit fullscreen mode

现在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!");
    }
}
Enter fullscreen mode Exit fullscreen mode

该命令可通过以下方式使用:

./minicli hello
Enter fullscreen mode Exit fullscreen mode

由于未提供子命令,因此推断您想要执行默认命令。该命令也可以这样调用:

./minicli hello default
Enter fullscreen mode Exit fullscreen mode

命名空间内的其他任何命令控制器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!");
    }
}
Enter fullscreen mode Exit fullscreen mode

这条新命令将以如下方式提供:

./minicli hello caps
Enter fullscreen mode Exit fullscreen mode

使用参数

Minicli 对命令调用参数使用了一些约定:

  • 参数/实参:已解析的参数 - 来自 $argv 的任何非 akey=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));
    }
}
Enter fullscreen mode Exit fullscreen mode

现在,要使用该命令的自定义版本,您需要运行:

./minicli hello user=erika 
Enter fullscreen mode Exit fullscreen mode

你会得到如下输出:

Hello, erika!
Enter fullscreen mode Exit fullscreen mode

CommandCall类方法

  • hasParam(string $key) : bool- 如果参数存在,则返回 true。
  • getParam(string $key) : string- 返回一个参数,如果参数不存在则返回 null。
  • hasFlag(string $key) : bool- 返回命令调用中是否传递了标志。

打印输出

该类CliPrinter提供了一些快捷方法,可以以各种颜色和样式打印消息。
它自带两个主题regularunicorn。这在应用程序引导配置数组中进行设置,默认情况下配置为使用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'));
    }
Enter fullscreen mode Exit fullscreen mode

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