如何覆盖Monolog核心处理程序?

时间:2015-02-20 17:11:28

标签: symfony monolog

在symfony 2.5.9中,我尝试覆盖Monolog的SwiftMailerHandler

class MySwiftMailerHandler extends SwiftMailerHandler
{
    public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true)
    {
         $message->setSubject('Lorem ipsum : ' . $message->getSubject()) ;
         parent::__construct($mailer, $message, $level, $bubble);
    }
}

服务

<service id="my_custom_handler" class="XXXX\Monolog\Handler\MySwiftMailerHandler">
    <tag name="monolog.handler.swift"/> <!-- which tag to use ? -->
</service>

和配置

monolog:
    handlers:
        mail:
            type:         fingers_crossed
            action_level: critical
            handler:      custom #before buffered
        custom:
            type: service
            id: my_custom_handler
        #buffered:
        #    type:    buffer
        #    handler: swift
        swift:
            type:       swift_mailer
            from_email: %monolog_from_email%
            to_email:   %monolog_to_email%
            subject:    'Error'
            level:      critical

但我的处理程序有以下错误:&#34; __ construct()必须是Swift_Mailer的一个实例,没有给出...&#34;

如何创建新的处理程序服务?配置错误?使用哪个标签?怎么做 ? 谢谢!

2 个答案:

答案 0 :(得分:1)

这很棘手。所有各种处理程序类都定义为monolog.xmlMonologBundle内的参数。 (MonologExtension似乎在一个大的switch语句中实例化和配置它们。)

要覆盖SwiftMailerHandler,请指定类参数,如下所示:

parameters: ... monolog.handler.swift_mailer.class: XXXX\Monolog\Handler\MySwiftMailerHandler

无需使用服务,标签等等。

我使用此方法覆盖SwiftMailerHandler::buildMessage()并动态更改电子邮件的主题。

答案 1 :(得分:0)

您可以使用编译器传递更改类:

  

Symfony documentation:如果要修改另一个包的服务定义,可以使用编译器传递来更改服务的类或修改方法调用。

// src/Kernel.php
namespace App;

// ...
+ use App\Service\YourService;
+ use Symfony\Component\DependencyInjection\ContainerBuilder;
+ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;

class Kernel extends BaseKernel implements CompilerPassInterface
{
+     public function process(ContainerBuilder $container)
+     {
+         $definition = $container->findDefinition('monolog.handler.swift');
+         $definition->setClass(YourService::class);
+     }
}