CakePHP3 debigkit перезаписывает ассоциацию классов

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

Мой транспортный класс, работающий должным образом, сохраняет исходящие электронные письма в базу данных, поэтому ясно, что отладка вызывает проблемы. Есть идеи, как решить проблему?

1 ответ

Решение

Это вызвано странным поведением DebugKit. Он сохраняет исходное имя класса транспорта в переменной "originalClassName" в конфигурации транспорта. Затем он использует свой собственный транспортный класс, чтобы получить информацию для вкладки почты панели отладки, затем пытается восстановить исходный транспортный класс, и в этот момент происходит сбой. Вы можете либо попытаться выгрузить отладочный пакет, либо проверить, существует ли ваш транспортный класс, прежде чем объявлять его, чтобы предотвратить несколько объявлений. Например: в src / Mailer / Transport / DbMailTransport.php

if (! class_exists ('DbMailTransport')) {class DbMailTransport расширяет AbstractTransport { .... } }

Другие вопросы по тегам