dreamcommerce/bugtracker-bundle

DreamCommerce Bugtracker Bundle

1.7.0 2020-09-08 12:57 UTC

README

License Version Build status on Linux

变更日志

1.7.0

  • 将最低的Symfony版本升级到4.4.13

1.6.0

  • 将最低的PHP版本升级到7.2
  • 将最低的Symfony版本升级到3.4.35或4.4

1.5.0

  • 将最低的PHP版本升级到7.1

1.4.0

  • 添加了对bugtracker收集器扩展上下文的支持

1.3.4

  • 将最低的Symfony版本升级到2.8
  • 许多修复

1.3.0

  • 添加了更多测试
  • 将收集器服务名称更改为dream_commerce_bug_tracker.<名称>_collector

1.2.2

  • 修复了Doctrine收集器
  • 修复了包配置

1.2.1

  • 将ContextInterface移动到dreamcommerce/common-bundle

1.2.0

  • 库不再支持PHP 5
  • 添加了doctrine DBAL类型

1.1.2

  • 添加了上下文特性

1.1.1

  • 改进了标记已收集收集器
  • 修复了自定义收集器
  • 添加了更多示例

1.1.0

  • 添加了doctrine收集器
  • 添加了swiftmailer收集器
  • 改进了jira收集器

安装(独立版)

安装lib/bundle

只需运行,假设您已安装composer.phar或composer二进制文件

$ composer require dreamcommerce/bugtracker-bundle

其他库

如果您想启用除PSR-3处理器以外的其他处理器,您还必须安装其他包

JIRA

$ composer require guzzlehttp/guzzle
$ composer require zendframework/zend-json

Doctrine

$ composer require doctrine/orm

Swiftmailer

$ composer require swiftmailer/swiftmailer

安装(在Symfony 4应用程序中)

启用包

在内核中启用包

// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        //...
            new DreamCommerce\Bundle\CommonBundle\DreamCommerceCommonBundle(),
            new DreamCommerce\Bundle\BugTrackerBundle\DreamCommerceBugTrackerBundle(),
        //...
    );
    return $bundles;
}

最小配置

dream_commerce_bug_tracker:
    configuration:
        jira:
            entry_point: "https://jira.example.com"
            username: "login"
            password: "*****"
            project: "PROJECT_SYMBOL"
        swiftmailer:
            sender: "%mailer_user%"
            recipients:
                - bugtracker@example.com

    collectors:
        psr3:
            type: psr3

        jira:
            type: jira
            
        doctrine:
            type: doctrine
            
        swiftmailer:
            type: swiftmailer

高级配置

dream_commerce_bug_tracker:
    configuration:
        base:
            token_generator: dream_commerce_bug_tracker.token_generator
            use_token: false
            ignore_exceptions:
                - 'RuntimeException'
            exceptions:
                - 'FooException'
                - 'BarException'
        jira:
            entry_point: "https://jira.example.com"
            username: "login"
            password: "*****"
            project: "PROJECT_SYMBOL"
            labels: [ "app_test" ]
            assignee: "my.login"
            token_generator: dream_commerce_bug_tracker.token_generator
            use_token: true
            ignore_exceptions:
                - 'RuntimeException1'
            exceptions:
                - 'FooException1'
                - 'BarException1'
          
        doctrine:
            model: AppBundle\Entity\UserError
            token_generator: dream_commerce_bug_tracker.token_generator
            use_token: true
            
        swiftmailer:
            sender: "%mailer_user%"
            recipients:
                - bugtracker@example.com
            ignore_exceptions:
                - 'RuntimeException2'
            exceptions:
                - 'FooException2'
                - 'BarException2'
            token_generator: dream_commerce_bug_tracker.token_generator
            use_token: false
                        
    collectors:
        psr3:
            type: psr3
            class: DreamCommerce\Component\BugTracker\Collector\Psr3Collector
            priority: 100
            options:
                ignore_exceptions:
                    - 'ErrorException'
                exceptions:
                    - 'MyException'
        jira:
            type: jira
            class: DreamCommerce\Component\BugTracker\Collector\JiraCollector
            level: error
            priority: -100
            
        doctrine:
            type: doctrine
            class: DreamCommerce\Component\BugTracker\Collector\DoctrineCollector
            options:
                model: AppBundle\Entity\UserError

        swiftmailer:
            type: swiftmailer
            class: DreamCommerce\Component\BugTracker\Collector\SwiftMailerCollector
            
        custom_1:
            type: custom
            class: AppBundle\BugTracker\CustomCollector
            options:
                foo: 1
                bar: 2           

用法

        <?php
        
        use Psr\Log\LogLevel;
        
        // use all collectors
        
        try {
            throw new RuntimeException();
        } catch(Exception $exc) {
            $this->get('bug_tracker')->handle($exc, LogLevel::ERROR, array('a' => 1, 'b' => 2, 'c' => 3, 'd' => new stdClass()));
        }
        
        // use only one collector
        
        try {
            throw new RuntimeException();
        } catch(Exception $exc) {
            $this->get('dream_commerce_bug_tracker.collector.custom_1')->handle($exc);
        }

示例

Doctrine

    <?php
    
    namespace AppBundle\Entity;
    
    use DreamCommerce\Component\BugTracker\Model\Error;
    
    class UserError extends Error
    {
    
    }
    <?xml version="1.0" encoding="utf-8"?>
    <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
      <entity repository-class="DreamCommerce\Component\BugTracker\Repository\ORMErrorRepository" name="AppBundle\Entity\UserError" table="user_errors">
            <!-- ... -->
      </entity>
    </doctrine-mapping>

自定义

    <?php
    
    namespace AppBundle\BugTracker;
    
    use DreamCommerce\Component\BugTracker\Collector\CollectorInterface;
    use DreamCommerce\Component\Common\Model\ArrayableInterface;
    use DreamCommerce\Component\Common\Model\ArrayableTrait;
    use Psr\Log\LogLevel;
    use Throwable;
    
    class CustomCollector implements CollectorInterface, ArrayableInterface
    {
        use ArrayableTrait;
    
        private $collected = false;
    
        private $foo;
    
        private $bar;
    
        public function __construct(array $options = array())
        {
            $this->fromArray($options);
        }
    
        public function hasSupportException(Throwable $exception, string $level = LogLevel::WARNING, array $context = array()): bool
        {
            return is_object($exception) && $exception instanceof \RuntimeException;
        }
    
        public function handle(Throwable $exception, string $level = LogLevel::WARNING, array $context = array())
        {
            echo $exception->getMessage() . '; foo: ' . $this->foo . '; bar: ' . $this->bar;
            $this->collected = true;
        }
    
        public function isCollected(): bool
        {
            return $this->collected;
        }
    
        public function setFoo($foo)
        {
            $this->foo = $foo;
        }
    
        public function setBar($bar)
        {
            $this->bar = $bar;
        }
    }

扩展

Bug Tracker可以在不修改它们的情况下,将额外的上下文注入到来自其他包的异常中。这些上下文在日志中可见,可以帮助诊断错误。这可以通过实现具有特殊标记的适当接口的简单服务来实现。有关更多信息,请参考以下示例。

首先,您需要创建一个实现 ContextCollectorExtensionInterface 接口的服务。实现ContextCollectorExtensionInterface的类需要一个名为 getAdditionalContext 的方法。有关详细信息,请参阅接口文件。

    <?php
    namespace AppBundle\BugTracker\Extension;
    
    use DreamCommerce\Component\BugTracker\Collector\Extension\ContextCollectorExtensionInterface;
    use Symfony\Component\HttpKernel\Exception\HttpException;
    use Symfony\Component\HttpFoundation\RequestStack;
    
    class ContextCollectorExtension implements ContextCollectorExtensionInterface
    {
        /**
         * @var RequestStack 
         */
        private $requestStack;
        
        public function __construct(RequestStack $requestStack) {
            $this->requestStack = $requestStack;
        }
        
        public function getAdditionalContext(\Throwable $throwable): array
        {
            if ($throwable instanceof HttpException) {
                $request = $this->requestStack->getMasterRequest();
                
                if ($request === null) {
                    return [];
                }
                
                return [
                    'query'     => serialize($request->query->all()),
                    'client_ip' => $request->server->get('REMOTE_ADDR')
                ];
            }
            
            return [];
        }
    }

下一步是创建我们的服务定义,带有标签 dream_commerce_bug_tracker.collector_extension

    ...
    <service id="app.bug_tracker_extension" class="AppBundle\BugTracker\Extension\ContextCollectorExtension">
        <argument type="service" id="request_stack" />

        <tag name="dream_commerce_bug_tracker.collector_extension" />
    </service>
    ...

现在,每当抛出HttpException时,我们将在日志文件中看到我们的附加信息。

如果您愿意,可以使用我们的嵌入式扩展

  • ClientIpContextExtension - 将客户端IP添加到日志中
<service id="app.bug_tracker_client_ip_extension" class="DreamCommerce\Bundle\BugTrackerBundle\Collector\Extension\ClientIpContextExtension">
    <argument type="service" id="request_stack" />
    <tag name="dream_commerce_bug_tracker.collector_extension" />
</service>
  • QueryDataContextExtension - 将存储在$_GET变量中的参数添加到日志中
<service id="app.bug_tracker_client_ip_extension" class="DreamCommerce\Bundle\BugTrackerBundle\Collector\Extension\QueryDataContextExtension">
    <argument type="service" id="request_stack" />
    <tag name="dream_commerce_bug_tracker.collector_extension" />
</service>
  • RequestDataContextExtension - 将存储在$_POST变量中的参数添加到日志中
<service id="app.bug_tracker_client_ip_extension" class="DreamCommerce\Bundle\BugTrackerBundle\Collector\Extension\RequestDataContextExtension">
    <argument type="service" id="request_stack" />
    <tag name="dream_commerce_bug_tracker.collector_extension" />
</service>
  • UserInfoContextExtension - 将有关当前用户(登录、角色、凭据等)的信息添加到日志中
<service id="app.bug_tracker_client_ip_extension" class="DreamCommerce\Bundle\BugTrackerBundle\Collector\Extension\UserInfoContextExtension">
    <argument type="service" id="security.token_storage" />
    <tag name="dream_commerce_bug_tracker.collector_extension" />
</service>

作者