命令行应用(Command Line Applications)

CLI应用即是运行在命令行窗体上的应用。 主要用来实现后台任务, 命令行工具等。

结构(Structure)

最小结构的CLI程序如下:

  • app/config/config.php
  • app/tasks/MainTask.php
  • app/cli.php <– 主要启动文件

创建引导(Creating a Bootstrap)

普通的MVC程序中,启动文件用来启动整个应用。和web应用不同, 此处应用中我们使用cli.php来作为启动文件。

下面是一个简单的启动文件示例:

  1. <?php
  2. use Phalcon\Di\FactoryDefault\Cli as CliDI;
  3. use Phalcon\Cli\Console as ConsoleApp;
  4. use Phalcon\Loader;
  5. // 使用CLI工厂类作为默认的服务容器
  6. $di = new CliDI();
  7. /**
  8. * 注册类自动加载器
  9. */
  10. $loader = new Loader();
  11. $loader->registerDirs(
  12. [
  13. __DIR__ . "/tasks",
  14. ]
  15. );
  16. $loader->register();
  17. // 加载配置文件(如果存在)
  18. $configFile = __DIR__ . "/config/config.php";
  19. if (is_readable($configFile)) {
  20. $config = include $configFile;
  21. $di->set("config", $config);
  22. }
  23. // 创建console应用
  24. $console = new ConsoleApp();
  25. $console->setDI($di);
  26. /**
  27. * 处理console应用参数
  28. */
  29. $arguments = [];
  30. foreach ($argv as $k => $arg) {
  31. if ($k === 1) {
  32. $arguments["task"] = $arg;
  33. } elseif ($k === 2) {
  34. $arguments["action"] = $arg;
  35. } elseif ($k >= 3) {
  36. $arguments["params"][] = $arg;
  37. }
  38. }
  39. try {
  40. // 处理参数
  41. $console->handle($arguments);
  42. } catch (\Phalcon\Exception $e) {
  43. echo $e->getMessage();
  44. exit(255);
  45. }

上面的代码可以使用如下方式执行:

  1. $ php app/cli.php
  2. 这样程序会直接执行默认的任务及默认动作.

任务(Tasks)

这里的任务同于web应用中的控制器。 任一 CLI 应用程序都至少包含一个mainTask 及一个 mainAction, 每个任务至少有一个mainAction, 这样在使用者未明确的 指定action时 此mainAction就会执行。

下面即是一个mainTask的例子( app/tasks/MainTask.php ):

  1. <?php
  2. use Phalcon\Cli\Task;
  3. class MainTask extends Task
  4. {
  5. public function mainAction()
  6. {
  7. echo "This is the default task and the default action" . PHP_EOL;
  8. }
  9. }

处理动作参数(Processing action parameters)

CLI应用中, 开发者也可以在action中处理传递过来的参数, 下面的例子中已经对传递过来的参数进行了处理。

如果你使用下面的参数和动作运行应用程序:

  1. <?php
  2. use Phalcon\Cli\Task;
  3. class MainTask extends Task
  4. {
  5. public function mainAction()
  6. {
  7. echo "This is the default task and the default action" . PHP_EOL;
  8. }
  9. /**
  10. * @param array $params
  11. */
  12. public function testAction(array $params)
  13. {
  14. echo sprintf(
  15. "hello %s",
  16. $params[0]
  17. );
  18. echo PHP_EOL;
  19. echo sprintf(
  20. "best regards, %s",
  21. $params[1]
  22. );
  23. echo PHP_EOL;
  24. }
  25. }

我们可以使用下面的命令行及参数执行程序:

  1. $ php app/cli.php main test world universe
  2. hello world
  3. best regards, universe

链中运行任务(Running tasks in a chain)

CLI应用中可以在一个action中执行另一action. 要实现这个需要在 DI 中设置console.

  1. <?php
  2. $di->setShared("console", $console);
  3. try {
  4. // Handle incoming arguments
  5. $console->handle($arguments);
  6. } catch (\Phalcon\Exception $e) {
  7. echo $e->getMessage();
  8. exit(255);
  9. }

然后开发者即可在一个action中使用用其它的action了. 下面即是例子:

  1. <?php
  2. use Phalcon\Cli\Task;
  3. class MainTask extends Task
  4. {
  5. public function mainAction()
  6. {
  7. echo "This is the default task and the default action" . PHP_EOL;
  8. $this->console->handle(
  9. [
  10. "task" => "main",
  11. "action" => "test",
  12. ]
  13. );
  14. }
  15. public function testAction()
  16. {
  17. echo "I will get printed too!" . PHP_EOL;
  18. }
  19. }

当然, 通过扩展 Phalcon\Cli\Task 来实现如上操作会是一个更好主意。