danc0 / dcli
轻量级PHP CLI应用程序框架。
Requires
- php: >=7.4
Requires (Dev)
- phpunit/phpunit: ^9
- squizlabs/php_codesniffer: ^3.7
README
基本PHP CLI应用程序框架。本项目无依赖,旨在为PHP CLI应用程序提供一个轻量级起点。
由于本项目仍在开发中,这些文档仍在不断完善。
完整文档(Beta版本)
基本设置
使用以下命令安装: 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
,无论是这些方法中的哪一种。
命令运行器将在解析处理器时自动设置这些变量。例如,如果您有一个具有可用参数 name
的 Default_Handler
,则命令运行器将在您的类中将 name
的值添加到 $this->name
中。
传递标志
标志被视为布尔值,可以使用 -
或 --
注释传递。
命令运行器将在解析处理器时自动设置这些变量。例如,如果您有一个具有可用标志 v
的 Default_Handler
,则命令运行器将根据是否传递设置 $this->v
为 true 或 false。
Command_Container
Command_Container 包含关于您的配置和请求环境的信息。要告诉命令运行器将其加载到您的处理器类中,您可以选择两种方法之一。首先,您可以在类中声明一个变量 public Command_Container $Command_Container
,这将是在类实例化之后设置的,因此您无法在构造函数中使用它,但可以在类的其他方法中使用。如果您需要在构造函数函数中使用它,请将 Command_Container $Command_Container
添加为需要传递到类中的变量。
全局 Event_Handler
主应用程序事件处理器可以通过使用上述为 Command_Container
描述的相同两种技术注入到您的处理器类中。