afrihost/base-command-bundle

Afrihost的“瑞士军刀”扩展Symfony的ContainerAwareCommand,定义了跨命令的常用可重用功能(如日志记录)

安装次数: 23,042

依赖项: 0

建议者: 0

安全: 0

星标: 5

关注者: 5

分支: 10

开放问题: 6

类型:symfony-bundle

v1.1.1 2020-04-01 13:52 UTC

README

Latest Stable Version Total Downloads License Build Status

如果你有很多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最佳实践
    • 贡献指南