在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;
如何创建新的处理程序服务?配置错误?使用哪个标签?怎么做 ? 谢谢!
答案 0 :(得分:1)
这很棘手。所有各种处理程序类都定义为monolog.xml
内MonologBundle
内的参数。 (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);
+ }
}