小型但功能强大的 CLI 应用程序使用 Minicli
发布时间 作者 史蒂夫·麦克道格
构建 CLI 应用程序非常有趣。我们无需担心 UI,可以编写不需要任何构建步骤的漂亮 PHP 代码。
在 PHP 中构建 CLI 应用程序时,我们没有像构建 Web 应用程序那样多的选择 - 但有一些可靠的竞争者。从使用事实上的标准 Symfony Console 组件或额外的辣味 Laravel Zero。但是,在构建 CLI 应用程序时,您可能希望尽可能地不依赖,这就是 Minicli 出现的地方。Minicli 一段时间前由 Erika Heidi 发布,作为构建一个不依赖的 CLI 框架的实验,该框架仅依赖于 PHPs readline 扩展。
我一直在花很多时间研究我正在从事的项目中的 CLI 选项。起初,我从我通常的选择开始:Laravel Zero。它对我和任何其他了解 Laravel 的开发人员来说都很熟悉。然后我开始质疑可移植性方面,并要求那些想要使用它的人拥有 PHP。这是为了工作,并不是所有用户都安装了 PHP。因此,我深入研究了编译语言的世界,研究了 GoLang 和 Rust。虽然没有太多可用的选项,但现有的选项非常出色。
最近关于原生 PHP 的讨论很多,这将我的注意力重新吸引到 PHP 空间。如果我能够构建一个轻量级、易于维护且可移植的 PHP CLI 应用程序呢?正是在这个时候,我再次查看了 Minicli。在它刚出来的时候玩过它,我对它在不依赖的情况下使用起来有多好印象深刻 - 但它也易于上手!
构建 Minicli 应用程序的推荐方法是使用应用程序骨架和作曲家来设置所有内容,并为您准备好。
composer create-project --prefer-dist minicli/application my-awesome-idea
对于您来说,这些目录应该足够熟悉,因为 Laravel 开发人员有一个 app
目录和命名空间。您创建的命令建议构建为 命令控制器
,它们是基于类的命令。
我们在 app/Commands
下创建一个命令命名空间,您将命令保存在其中。
mkdir app/Commands/LaravelNews
在每个命名空间下,您可以为不同的变体添加多个命令。如果未传递任何参数,则推断您将想要使用 DefaultController
。让我们看看如何创建一个命令。
declare(strict_types=1); namespace App\Command\LaravelNews; use Minicli\Command\CommandController; final class DefaultController extends CommandController{ public function handle(): void { $this->getPrinter()->display("Laravel News rocks"); }}
每个命令控制器都必须 处理
,并且不需要返回任何内容 - 与 Symfony 或 Laravel Zero 不同,后者需要一个退出代码。要与输出交互,您获得打印机 - 并要求它输出内容。
所以,如果我们想添加一个替代版本 - 我们可以为我们的命名空间创建一个其他命令控制器。
declare(strict_types=1); namespace App\Command\LaravelNews; use Minicli\Command\CommandController; final class InfoController extends CommandController{ public function handle(): void { $this->getPrinter()->info("Laravel News rocks"); }}
现在我们可以调用我们的命令
./minicli laravel-news info
这将为默认命令提供一个不同的视图,我们可以使用以下其他选项
display()
:一个简单的文本输出。info()
:一个信息性的文本输出。error()
:一个错误格式化的文本输出。success()
:一个成功格式化的文本输出。
每个选项都接受第二个参数作为 alt
用于替代输出,它将使用写入而不是彩色写入进行块颜色输出。
它不像 Laravel Zero 使用 Termwind 那样漂亮 - 但有时你不需要漂亮!
通常,在构建 CLI 应用程序时,我们希望与第三方 API 或其他服务交互以执行操作或逻辑。在 Minicli 中,这是通过创建服务来完成的。
// minicli$app = new App();$app->registerService( 'email', new MyEmailImplementation(),);
然后,在我们的命令中,我们可以获取应用程序实例并直接调用我们的服务
public function handle(): void{ $service = $this->getApp()->email; try { $service->send(new EmailTemplate()); } catch (Throwable $exception) { $this->getPrinter()->error($exception->getMessage()); }}
因此,我们有一个轻量级、功能强大的 CLI 框架,我们可以利用它来帮助我们的开发工作流程 - 它没有依赖项,允许我们编写漂亮的 PHP。
您尝试过 Minicli 吗?您使用过类似的东西吗?在推特上告诉我们!