多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 创建命令行(CLI)应用程序 CLI应用程序从命令行执行。它们对于创建定时作业,脚本,命令实用程序等非常有用。 ## 结构 CLI应用程序的最小结构如下所示: * `app/config/config.php` * `app/tasks/MainTask.php` * `app/cli.php` 主启动文件 ## 创建启动程序 与常规MVC应用程序一样,启动程序文件用于启动应用程序。我们使用`cli.php`文件来启动应用程序,而不是Web应用程序中的`index.php`启动程序。 下面是一个用于此示例的示例启动程序。 ```php <?php use Phalcon\Di\FactoryDefault\Cli as CliDI; use Phalcon\Cli\Console as ConsoleApp; use Phalcon\Loader; // 使用CLI工厂默认服务容器 $di = new CliDI(); /** * 注册自动加载器并告诉它注册任务目录 */ $loader = new Loader(); $loader->registerDirs( [ __DIR__ . '/tasks', ] ); $loader->register(); // 加载配置文件(如果有) $configFile = __DIR__ . '/config/config.php'; if (is_readable($configFile)) { $config = include $configFile; $di->set('config', $config); } // 创建控制台应用程序 $console = new ConsoleApp(); $console->setDI($di); /** * 处理控制台参数 */ $arguments = []; foreach ($argv as $k => $arg) { if ($k === 1) { $arguments['task'] = $arg; } elseif ($k === 2) { $arguments['action'] = $arg; } elseif ($k >= 3) { $arguments['params'][] = $arg; } } try { // 处理传入的参数 $console->handle($arguments); } catch (\Phalcon\Exception $e) { // Phalcon在这里做了相关的事情 // .. fwrite(STDERR, $e->getMessage() . PHP_EOL); exit(1); } catch (\Throwable $throwable) { fwrite(STDERR, $throwable->getMessage() . PHP_EOL); exit(1); } ``` 这段代码可以使用以下命令运行: ```bash php app/cli.php ``` ## 任务 任务与控制器类似。任何CLI应用程序至少需要一个`MainTask`和一个`mainAction`,并且每个任务都需要有一个`mainAction`,如果没有明确给出任何操作,它将运行。 下面是 `app/tasks/MainTask.php` 文件的示例: ```php <?php use Phalcon\Cli\Task; class MainTask extends Task { public function mainAction() { echo 'This is the default task and the default action' . PHP_EOL; } } ``` ## 处理动作参数 可以将参数传递给操作,其代码已经存在于示例启动程序中。 如果使用以下参数和操作运行应用程序: ```php <?php use Phalcon\Cli\Task; class MainTask extends Task { public function mainAction() { echo 'This is the default task and the default action' . PHP_EOL; } /** * @param array $params */ public function testAction(array $params) { echo sprintf('hello %s', $params[0]); echo PHP_EOL; echo sprintf('best regards, %s', $params[1]); echo PHP_EOL; } } ``` 然后我们可以运行以下命令: ```bash php app/cli.php main test world universe hello world best regards, universe ``` ## 链式操作运行任务 如果需要,还可以用链式操作运行任务。要实现此目的,您必须将控制台本身添加到DI: ```php <?php $di->setShared("console", $console); try { // 处理传入的参数 $console->handle($arguments); } catch (\Phalcon\Exception $e) { // Phalcon在这里做了相关的事情 // .. fwrite(STDERR, $e->getMessage() . PHP_EOL); exit(1); } catch (\Throwable $throwable) { fwrite(STDERR, $throwable->getMessage() . PHP_EOL); exit(1); } ``` 然后你可以在任何任务中使用控制台。下面是修改后的MainTask.php的示例: ```php <?php use Phalcon\Cli\Task; class MainTask extends Task { public function mainAction() { echo "This is the default task and the default action" . PHP_EOL; $this->console->handle( [ "task" => "main", "action" => "test", ] ); } public function testAction() { echo "I will get printed too!" . PHP_EOL; } } ``` 但是,扩展 `Phalcon\Cli\Task` 并在那里实现这种逻辑是一个更好的主意。