visto9259 / laminas-console-symfony
基于 Symfony Console 的 Laminas 框架控制台应用程序
Requires
- laminas/laminas-config-aggregator: ~1.0
- laminas/laminas-loader: ^2.6
- laminas/laminas-modulemanager: ^2.8.0
- laminas/laminas-servicemanager: ^3.0.0
- symfony/console: ^5.0
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
是命令配置数组。有关详细信息,请参阅定义命令。
modules
和 module_listener_options
是模块管理器配置参数。
service_manager
包含典型的 Laminas 框架服务管理器配置,它允许定义服务、工厂等。
与 laminas-mvc
应用程序的差异
此应用程序受到 laminas-mvc
应用程序的启发,但它并不是旨在实现完整 MVC 应用程序。它是对 Symfony 控制台应用程序的包装,提供了服务管理器以实现依赖注入,并使用模块管理器来加载模块。
目的是如果想要使用现有或自定义的 Laminas 模块,则可以将其添加到要加载的模块列表中。例如,如果某个模块定义了用于访问数据库的服务,则它将通过模块管理器加载,并且其服务将添加到服务管理器中。
模块配置中的限制
LaminasConsoleSymfony 应用程序使用模块管理器 loadModules()
方法来加载模块,但只会服务实现 ServiceProviderInterface
和 ConfigProviderInterface
接口的服务模块。所有其他提供者接口都被忽略。
重要:目前模块类 不应 实现 BootstrapListenerInterface
和 InitProviderInterface
。这些会导致应用程序崩溃。
定义命令
可以在 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 命令定义的数组。其中 name
、description
和 help
的用法定义在 Symfony 命令文档中。arguments
和 options
数组包含了 Symfony InputArgument
和 InputOption
定义列表。
命令定义中的 class
元素指的是实现 Symfony 命令的类的名称。类必须扩展 Symfony\Component\Console\Command\Command
类。class
可以是一个类名或字符串。应用程序将使用 Laminas 框架服务管理器来实例化该类,允许使用工厂创建命令并注入依赖。此外,class
也可以是一个 Symfony\Component\Console\Command\Command
类的实例。
service_manager
包含了将被添加到应用程序服务管理器的典型服务管理器配置。
如果一个命令不需要特定的工厂来创建,命令定义中的 class
元素可以简单地提供命令的类名,服务管理器将使用 AbstractCommandFactory
来创建命令。
反馈
该包仍在开发中。它尚未对所有可想到的情况进行彻底测试。如果您发现任何问题,请记录问题。
我也非常欢迎反馈和改进建议。