CakePHP3 debigkit 覆盖 class 关联
CakePHP3 debigkit overwrites class association
在 cakephp3 中,我使用的是 debugkit。我的目标是创建一个新的 Mailer 传输 class,它将外发电子邮件存储在数据库中,以防止它在调试模式下被发送出去。
我已将我的交通工具 class 放入
src/Mailer/Transport/DbMailTransport.php
接着我将此 class 设置为默认的 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) {
}
}
}
}
所以 class 名称是 "DebugKit.DebugKit" 而不是 "DbMail"。
在 bootstrap.php 中关闭 DebugKit 后,我得到了正确的 classname:
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
}
}
我的传输 class 按预期工作,将外发电子邮件保存到数据库中,很明显是 debugkit 导致了问题。知道如何解决这个问题吗?
这是由 DebugKit 的异常行为引起的。它将原始传输 class 名称存储在传输配置的 'originalClassName' 变量中。然后它使用自己的传输 class 获取调试面板邮件选项卡的信息,然后尝试恢复原始传输 class,这就是它失败的地方。您可以尝试卸载 debugkit,或者在声明它之前检查您的传输 class 是否存在,以防止多次声明。例如:在 src/Mailer/Transport/DbMailTransport.php
if(!class_exists('DbMailTransport')){
class DbMailTransport 扩展了 AbstractTransport
{
....
}
}
在 cakephp3 中,我使用的是 debugkit。我的目标是创建一个新的 Mailer 传输 class,它将外发电子邮件存储在数据库中,以防止它在调试模式下被发送出去。
我已将我的交通工具 class 放入
src/Mailer/Transport/DbMailTransport.php
接着我将此 class 设置为默认的 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) {
}
}
}
}
所以 class 名称是 "DebugKit.DebugKit" 而不是 "DbMail"。 在 bootstrap.php 中关闭 DebugKit 后,我得到了正确的 classname:
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
}
}
我的传输 class 按预期工作,将外发电子邮件保存到数据库中,很明显是 debugkit 导致了问题。知道如何解决这个问题吗?
这是由 DebugKit 的异常行为引起的。它将原始传输 class 名称存储在传输配置的 'originalClassName' 变量中。然后它使用自己的传输 class 获取调试面板邮件选项卡的信息,然后尝试恢复原始传输 class,这就是它失败的地方。您可以尝试卸载 debugkit,或者在声明它之前检查您的传输 class 是否存在,以防止多次声明。例如:在 src/Mailer/Transport/DbMailTransport.php
if(!class_exists('DbMailTransport')){ class DbMailTransport 扩展了 AbstractTransport { .... } }