CakePHP3 debigkit会覆盖类关联

时间:2017-08-22 16:41:44

标签: php cakephp cakephp-3.0 mailer cakeemail

在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
  }
}

我的传输类按预期工作,将传出的电子邮件保存到数据库中,因此显然调试包会导致问题。知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这是由DebugKit的奇怪行为引起的。它将原始传输类名称存储在传输配置中的“originalClassName”变量中。然后,它使用自己的传输类来获取调试面板的邮件选项卡的信息,然后尝试还原原始传输类,这就是它失败的地方。您可以尝试卸载调试工具,也可以在声明传输类之前检查它是否存在,以防止多个声明。例如:src / Mailer / Transport / DbMailTransport.php

如果(!class_exists( 'DbMailTransport')){     class DbMailTransport扩展了AbstractTransport     {     ....     } }