在cakephp3中,我使用的是debugkit。我的目标是创建一个新的Mailer传输类,它将传出的电子邮件存储在数据库中,以防止它在调试模式下发送出去。
我已将我的Transport类放在
中 src/Mailer/Transport/DbMailTransport.php
按照这一点,我将此类设置为默认的Mailer传输。
Email::configTransport('default', [
'className' => 'DbMail',
'host' => '',
'port' => false,
'timeout' => false,
'username' => '',
'password' => '',
'client' => null,
'tls' => true,
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
]);
尝试发送电子邮件时出现以下错误:
Fatal error: Cannot declare class Cake\Mailer\Transport\DbMailTransport, because the name is already in use in /src/Mailer/Transport/DbMailTransport.php on line 0
在进一步挖掘代码调试$ _transportConfig后,我得到了以下变量:
array(1) {
["default"]=>
array(11) {
["className"]=>
string(17) "DebugKit.DebugKit"
["host"]=>
string(0) ""
["port"]=>
bool(false)
["timeout"]=>
bool(false)
["username"]=>
string(0) ""
["password"]=>
string(0) ""
["client"]=>
NULL
["tls"]=>
bool(true)
["url"]=>
NULL
["originalClassName"]=>
string(6) "DbMail"
["debugKitLog"]=>
object(ArrayObject)#184 (1) {
["storage":"ArrayObject":private]=>
array(0) {
}
}
}
}
所以className是" DebugKit.DebugKit"而不是" DbMail"。 在bootstrap.php中关闭DebugKit后,我得到了正确的类名:
array(1) {
["default"]=>
array(9) {
["className"]=>
string(6) "DbMail"
["host"]=>
string(0) ""
["port"]=>
bool(false)
["timeout"]=>
bool(false)
["username"]=>
string(0) ""
["password"]=>
string(0) ""
["client"]=>
NULL
["tls"]=>
bool(true)
["url"]=>
NULL
}
}
我的传输类按预期工作,将传出的电子邮件保存到数据库中,因此显然调试包会导致问题。知道如何解决这个问题吗?
答案 0 :(得分:0)
这是由DebugKit的奇怪行为引起的。它将原始传输类名称存储在传输配置中的“originalClassName”变量中。然后,它使用自己的传输类来获取调试面板的邮件选项卡的信息,然后尝试还原原始传输类,这就是它失败的地方。您可以尝试卸载调试工具,也可以在声明传输类之前检查它是否存在,以防止多个声明。例如:src / Mailer / Transport / DbMailTransport.php
如果(!class_exists( 'DbMailTransport')){ class DbMailTransport扩展了AbstractTransport { .... } }