В cakephp3 я использую debugkit. Моя цель — создать новый транспортный класс Mailer, который хранит исходящие электронные письма в базе данных, чтобы предотвратить их отправку в режиме отладки.
Я поместил свой класс транспорта в
src/Mailer/Transport/DbMailTransport.php
После этого я установил этот класс в качестве почтового транспорта по умолчанию.
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».
После отключения DebugKit в bootstrap.php я получил правильное имя класса:
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
}
}
Мой транспортный класс, работающий должным образом, сохраняет исходящие электронные письма в базу данных, поэтому ясно, что отладка вызывает проблемы. Есть идеи, как решить проблему?
Это вызвано странным поведением DebugKit. Он сохраняет исходное имя класса транспорта в переменной «originalClassName» в конфигурации транспорта. Затем он использует свой собственный транспортный класс, чтобы получить информацию для вкладки почты панели отладки, затем пытается восстановить исходный транспортный класс, и в этот момент происходит сбой. Вы можете либо попытаться выгрузить отладочный пакет, либо проверить, существует ли ваш транспортный класс, прежде чем объявлять его, чтобы предотвратить несколько объявлений. Например: в src / Mailer / Transport / DbMailTransport.php
если (! class_exists ( ‘DbMailTransport’)) {
класс DbMailTransport расширяет AbstractTransport
{
….
}
}
Других решений пока нет …