visto9259/laminas-console-symfony

基于 Symfony Console 的 Laminas 框架控制台应用程序

1.0.0 2020-02-17 14:32 UTC

This package is auto-updated.

Last update: 2024-09-02 19:54:45 UTC


README

简介

laminas-console-symfony 通过为 symfony/console 组件提供包装,为 zf-console 提供替代品。

对于熟悉 Laminas MVC 应用的开发者,此包在模块和依赖注入(使用服务管理器)的使用上受到了 laminas-mvc 的启发。

要求

请参阅 composer.json 文件。

安装

运行以下 composer 命令

$ composer require visto9259/laminas-console-symfony

或者,也可以手动将以下内容添加到您的 composer.json 文件的 require 部分

"require" : {
    "visto9259/laminas-console-symfony" : "^1.0.0"
}

然后运行 composer update 确保模块已安装。

创建控制台应用程序

控制台应用程序骨架基于 Laminas 框架 MVC 应用程序骨架。它遵循类似的目录结构

MyApp/
   config/
      autoload/
         global.php
         local.php
         ... other config files
      application.config.php
      modules.config.php
      commands.config.php
      development.config.php (optional)
   module/
      myModule/
        config/
           module.config.php (optional)
        src/
           Module.php
   vendor/
      composer/
      ...
      autoload.php (created by Composer)
   myapp.php (entry point of the application)

myapp.php 文件包含控制台应用程序代码,可以非常简单

require __DIR__.'/vendor/autoload.php';
     
use Laminas\Stdlib\ArrayUtils;
use LaminasSymfonyConsole\Application;
     
// Setup the application
$appConfig = require __DIR__ . '/config/application.config.php_dist';
if (file_exists(__DIR__ . '/config/development.config.php')) {
   $appConfig = ArrayUtils::merge($appConfig, require __DIR__ . '/config/development.config.php');
}
$application = new Application($appConfig);
     
$exit = $application->run();

配置应用程序

application_config.php 文件提供了控制台应用程序的配置以及使用 Laminas 框架模块管理器加载模块的配置。它包含以下内容

return [
    'console_application_options' => [
        'name' => 'Test',
        'version' => '0.1',
    ],
    'commands' => require __DIR__ . '/commands.config.php_dist',
    'modules' => require __DIR__ . '/modules.config.php',
    'module_listener_options' => [
        'module_paths' => [
            './module',
            './vendor',
        ],
        'config_glob_paths' => [
            realpath(__DIR__) . '/autoload/{{,*.}global,{,*.}local}.php',
        ],
    ],
    'service_manager' => [
        // typical Service Manager configation
    ],   
];

console_application_options 包含传递给 Symfony\Component\Console\Application 构造函数的 $name$version 参数。

commands 是命令配置数组。有关详细信息,请参阅定义命令

modulesmodule_listener_options 是模块管理器配置参数。

service_manager 包含典型的 Laminas 框架服务管理器配置,它允许定义服务、工厂等。

laminas-mvc 应用程序的差异

此应用程序受到 laminas-mvc 应用程序的启发,但它并不是旨在实现完整 MVC 应用程序。它是对 Symfony 控制台应用程序的包装,提供了服务管理器以实现依赖注入,并使用模块管理器来加载模块。

目的是如果想要使用现有或自定义的 Laminas 模块,则可以将其添加到要加载的模块列表中。例如,如果某个模块定义了用于访问数据库的服务,则它将通过模块管理器加载,并且其服务将添加到服务管理器中。

模块配置中的限制

LaminasConsoleSymfony 应用程序使用模块管理器 loadModules() 方法来加载模块,但只会服务实现 ServiceProviderInterfaceConfigProviderInterface 接口的服务模块。所有其他提供者接口都被忽略。

重要:目前模块类 不应 实现 BootstrapListenerInterfaceInitProviderInterface。这些会导致应用程序崩溃。

定义命令

可以在 config/commands.config.php 中定义 Symfony 控制台命令。当创建控制台应用程序时,将实例化并添加到应用程序中。

典型的 commands.config.php 可能包含以下内容

use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use LaminasSymfonyConsole\Factory\AbstractCommandFactory;

return [
    'commands' => [
        [
            'name' => 'test',
            'description' => 'Test command',
            'help' => 'Test help message',
            'class' => Test::class,
            'arguments' => [
                [
                    'name' => 'arg1',
                    'mode' => InputArgument::OPTIONAL,
                    'description' => 'Argument 1',
                ],
                [
                    'name' => 'arg2',
                    'mode' => InputArgument::OPTIONAL,
                    'description' => 'Argument 2',
                    'default' => 'some default',
                ],
            ],
            'options' => [
                [
                    'name' => 'yell',
                    'shortcut' => 'y',
                    'mode' => InputOption::VALUE_REQUIRED,
                    'description' => 'yell option',
                ],
            ],
        ],
    ],
    'service_manager' => [
        'factories' => [
            Test::class => AbstractCommandFactory::class,
        ]
    ]
];

commands 是一个包含 Symfony 命令定义的数组。其中 namedescriptionhelp 的用法定义在 Symfony 命令文档中。argumentsoptions 数组包含了 Symfony InputArgumentInputOption 定义列表。

命令定义中的 class 元素指的是实现 Symfony 命令的类的名称。类必须扩展 Symfony\Component\Console\Command\Command 类。class 可以是一个类名或字符串。应用程序将使用 Laminas 框架服务管理器来实例化该类,允许使用工厂创建命令并注入依赖。此外,class 也可以是一个 Symfony\Component\Console\Command\Command 类的实例。

service_manager 包含了将被添加到应用程序服务管理器的典型服务管理器配置。
如果一个命令不需要特定的工厂来创建,命令定义中的 class 元素可以简单地提供命令的类名,服务管理器将使用 AbstractCommandFactory 来创建命令。

反馈

该包仍在开发中。它尚未对所有可想到的情况进行彻底测试。如果您发现任何问题,请记录问题。

我也非常欢迎反馈和改进建议。

© 2019 Eric Richer (eric.richer@vistoconsulting.com)