danc0 / dcli

轻量级PHP CLI应用程序框架。

安装: 29

依赖项: 0

建议: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放性问题: 0

类型:项目

v4.0.0 2022-07-10 05:13 UTC

README

基本PHP CLI应用程序框架。本项目无依赖,旨在为PHP CLI应用程序提供一个轻量级起点。

由于本项目仍在开发中,这些文档仍在不断完善。

完整文档(Beta版本)

GitHub tag (latest by date) GitHub

基本设置

使用以下命令安装: composer create-project danc0/dcli 或下载最新包。

创建主文件(例如: src/dcli)后,请确保该文件可执行,并可选择将其添加到路径中,以便您可以从任何位置调用应用程序。您还需要创建一个Composer自动加载文件。

最基本的设置使用匿名函数处理命令。

#!/usr/bin/php
<?php

if (php_sapi_name() !== 'cli') {
    exit;
}

require_once __DIR__ . '/vendor/autoload.php';

use App\Core\Application; // Main Application
use App\Core\Config; // Process the config
use App\Core\Command_Request; // Process the Request
use App\Core\Command_Container; // Stores the config and request environment
use App\IO\Output;

// Get any user set config values
$config = Config::load(__DIR__ . '/App/config.ini')->get();

// Load the request into the Command_Container
$Command_Request   = new Command_Request($argv);
$Command_Container = new Command_Container($config, $Command_Request->process());

// Load the Application
$app = Application::load($Command_Container);

// Set the commands
$app->set('hello-world', function () {
    Output::message('Hello World');
});

// Run the Application
$app->run();

这是可能的最基本用法,并且不利用子命令。

通过类@方法调用

此方法也不使用子命令,但允许您将逻辑移动到类中。

#!/usr/bin/php
<?php

if (php_sapi_name() !== 'cli') {
    exit;
}

require_once __DIR__ . '/vendor/autoload.php';

use App\Core\Application; // Main Application
use App\Core\Config; // Process the config
use App\Core\Command_Request; // Process the Request
use App\Core\Command_Container; // Stores the config and request environment
use App\IO\Output;
use App\Commands\Hello\Test;

// Get any user set config values
$config = Config::load(__DIR__ . '/App/config.ini')->get();

// Load the request into the Command_Container
$Command_Request   = new Command_Request($argv);
$Command_Container = new Command_Container($config, $Command_Request->process());

// Load the Application
$app = Application::load($Command_Container);

// Set the commands
$app->set('hello-world', Test::class . '@test');

// Run the Application
$app->run();

这将调用 Test 类中的 test 方法。

文件结构控制的命令

此方法使用子命令。要使用高级结构,需要特定的项目布局。将处理命令的类放置在 src/App/Commands 目录中。命令应该是子目录。例如,命令 hello 应放置在 src/App/Commands/Hello 中。在此目录中创建一个名为 Default_Handler.php 的文件。此文件以及 src/App/Commands 目录中的所有类应实现 Command_Handler_Interface。这是在命令 hello 上调用的文件。

要使用子命令,创建一个具有该子命令名称的附加文件。例如, hello test 需要您在 src/App/Commands/Hello 中创建一个名为 Test.php 的文件,其中包含一个名为 Test 的类。此文件将被调用来处理子命令。

这需要在主文件中进行最小设置。

#!/usr/bin/php
<?php

if (php_sapi_name() !== 'cli') {
    exit;
}

require_once __DIR__ . '/vendor/autoload.php';

use App\Core\Application; // Main Application
use App\Core\Config; // Process the config
use App\Core\Command_Request; // Process the Request
use App\Core\Command_Container; // Stores the config and request environment

// Get any user set config values
$config = Config::load(__DIR__ . '/App/config.ini')->get();

// Load the request into the Command_Container
$Command_Request   = new Command_Request($argv);
$Command_Container = new Command_Container($config, $Command_Request->process());

// Load the Application
$app = Application::load($Command_Container);

// Run the Application
$app->run();

Application 类处理调用逻辑和路由。

传递参数

参数被视为以 -- 注释开始的键值对传递。参数可以通过以下方式传递到命令中

dcli hello --name "John Smith"
# OR

dcli hello --name John Smith

命令解析器将为 name 参数返回 John Smith,无论是这些方法中的哪一种。

命令运行器将在解析处理器时自动设置这些变量。例如,如果您有一个具有可用参数 nameDefault_Handler,则命令运行器将在您的类中将 name 的值添加到 $this->name 中。

传递标志

标志被视为布尔值,可以使用 --- 注释传递。

命令运行器将在解析处理器时自动设置这些变量。例如,如果您有一个具有可用标志 vDefault_Handler,则命令运行器将根据是否传递设置 $this->v 为 true 或 false。

Command_Container

Command_Container 包含关于您的配置和请求环境的信息。要告诉命令运行器将其加载到您的处理器类中,您可以选择两种方法之一。首先,您可以在类中声明一个变量 public Command_Container $Command_Container,这将是在类实例化之后设置的,因此您无法在构造函数中使用它,但可以在类的其他方法中使用。如果您需要在构造函数函数中使用它,请将 Command_Container $Command_Container 添加为需要传递到类中的变量。

全局 Event_Handler

主应用程序事件处理器可以通过使用上述为 Command_Container 描述的相同两种技术注入到您的处理器类中。