afrihost / base-command-bundle
Afrihost的“瑞士军刀”扩展Symfony的ContainerAwareCommand,定义了跨命令的常用可重用功能(如日志记录)
Requires
- php: ~7.1
- monolog/monolog: ~1.10
- symfony/symfony: ~3.0|~4.0
Requires (Dev)
- phpunit/phpunit: ^7
README
如果你有很多Symfony命令,或者你只想跳过设置命令时的样板代码,这个包就是为你准备的。它的核心是一个扩展Symfony的ContainerAwareCommand的抽象类。这添加了我们自己的初始化意见,涵盖了各种样板,如日志记录和锁定,这样你就不必在每个命令中重新发明轮子。
整体设计目标是让你能够在 Symphony 配置中全局定义默认值(例如,是否将日志输出复制到控制台),同时仍然可以在单个命令中覆盖这些默认值(例如,这个命令必须始终获取锁),然后在运行时再次更改主意(例如,将日志级别设置为DEBUG)。
这是我们希望与您分享的一小段“开发者友好”的代码,希望它能让您的生活变得更轻松。如果您对此感兴趣,欢迎提交拉取请求。
安装
首先使用composer安装此包
composer require afrihost/base-command-bundle
注意:版本零(~0.6)下仍支持Symfony 2和PHP 5。我们将继续在此版本上发布任何重要的错误和安全修复,但新功能将不会回滚。当前版本支持Symfony ~3.0和PHP ~7.0
然后,通过将其添加到项目中app/AppKernel.php
文件中注册的包列表来启用包
// in AppKernel::registerBundles() $bundles = array( // there should be a bunch of symfony bundles and your bundles already added here new Afrihost\BaseCommandBundle\AfrihostBaseCommandBundle(), // ... );
配置
为所有选项指定了默认值,因此不需要进行配置,但如果你愿意,你可以在你的app/config/config.yml
文件中覆盖默认配置选项
afrihost_base_command: locking: lock_file_folder: storage enabled: true logger: handler_strategies: file_stream: enabled: true line_format: '%%datetime%% [%%level_name%%]: %%message%%' file_extension: .log.txt console_stream: enabled: true line_format: '%%datetime%% [%%level_name%%]: %%message%%'
锁定:你可以选择通过配置启用/禁用锁定。默认情况下启用锁定。
你可能还想更改默认的锁文件创建位置。如果你不指定锁文件文件夹,则锁将在系统的默认临时目录中创建。如果你指定一个相对目录,则锁将相对于Symfony Kernel根目录创建(在大多数情况下是“app”)。如果你指定一个绝对路径,则该目录必须已存在且可由PHP进程访问。在POSIX环境中,可以提供以~开头的路径。这将使用$HOME环境变量展开,并且完整路径将受到与绝对路径相同的约束。
示例(相对): "storage" >> 这将假定您希望在app/storage下。 "storage/lockfiles" >> 这将假定您希望在"app/storage/lockfiles"下。示例(绝对):"/var/my-lockfiles" >> 这将在"/var/my-lockfiles"下存储它。 "~/my-lockfiles" >> 锁文件将在"/home/your_username/my-lockfiles"下创建。
有关锁定功能的完整文档,请参阅Resources/doc/locking.md
日志记录 日志系统具有使用多个处理器的功能。很快还会添加更多处理器,也欢迎您添加自己的处理器并发送PR。每个处理器都有启用/禁用的潜力。在这个阶段,处理器默认都是启用的。处理器通常具有行格式化。line_format
条目说明了这种格式的样子,可以在config.yml文件中覆盖。文件记录器有一个文件扩展名,由file_extension
指定,默认为,但也可以在config.yml中覆盖。
关于日志功能的完整文档可以在Resources/doc/logging.md找到。
基本用法
不需要像这样扩展ContainerAwareCommand
class MyCoolCommand extends ContainerAwareCommand { // your stuff here }
... 您只需像这样扩展我们的BaseCommand
use Afrihost\BaseCommandBundle\Command\BaseCommand; // ... class MyCoolCommand extends BaseCommand { // your stuff here }
不必担心,BaseCommand仍然扩展了ContainerAwareCommand,所以您从ContainerAwareCommand中熟悉的所有好处都还在。BaseCommand仅仅添加了一些额外的样板和工具供您使用,例如
日志处理器初始化 - 您可以立即使用Monolog开始日志记录
$this->getLogger()->error('Hello World!')
运行时日志级别 - 不必更改代码即可从命令行更改日志级别。只需提供--log-level
参数以及Monolog支持的任何RFC 5424 严重性名称
$ php app/console my:cool:command --log-level=DEBUG
日志到控制台 - 切换是否希望日志条目同时发送到STDOUT和日志文件
输出图标
echo $this->getIcon()->tick()->white()->bgGreen()->bold()->render() . PHP_EOL;
待办事项
以下是我们希望添加的功能。当这个列表完成(或相当短)时,我们将发布我们的第一个主要版本
- 日志文件名称策略:目前,日志文件名称可以是手动指定,也可以从定义命令的文件名中生成。我们希望通过策略模式(日志文件名可以作为临时解决方案在参数中指定)提供其他选项
- 可配置的日志文件扩展名:由于历史原因,日志文件名都以
.log.txt
结尾。这个扩展名应该是一个配置选项 - 未处理异常监听器:自动将未处理的异常记录到为命令实例化的记录器。这已经在我们的生产版本中提供,但需要使其更可重用
- 捆绑配置:
- 默认日志级别
- 日志到控制台
- 日志到文件
- PHP错误报告
- PHP内存限制
- PHP最大执行时间
- 指定锁处理器锁文件位置
- 用户指定的行格式化程序:我们的默认格式(%datetime% [%level_name%]: %message%)是硬编码的。如果您希望使用特定工具解析日志,这并不理想。
- 锁定:集成机制以确保一次只有一个进程执行命令
- 配置Monolog的AllowLineBreaks选项:因为有时您希望在日志条目中间有新行
- PHPUnit:配置和基本代码覆盖率。目标是拥有某种形式的Github集成CI
- 输出图标:创建一个辅助程序,在输出前添加unicode图标(如勾号)
- 文档:
-
变更日志(在Github版本中列出主要更改) - 种子
Resources/doc/
(Symfony最佳实践) - 贡献指南
-