CakePhp: Cake Email AfterSend event

Всем доброе утро,

В настоящее время я использую CakePHP.
Я хотел бы настроить событие после отправки электронной почты CakePHP, потому что я хотел бы сохранить журнал этого письма в базе данных с отдельными столбцами для отправителя, получателя, объекта и тела.
В настоящее время я использую собственную систему журналов (все заголовки и тело электронной почты в одном месте), но становится слишком грязным для отладки.

Класс CakeEmail не предлагает методы обратного вызова, и я не могу найти способ вызвать этот тип событий без редактирования класса CakeEmail.
Конечно, я могу создать класс MyCakeEmail, который расширяет собственный класс CakeEmail, но это означает, что все новые CakeEmail () все же в коде.

Что ты предлагаешь?
Спасибо большое!

(Извините за плохой английский, не мой родной язык)

Используйте собственный регистратор:

Внесите свой собственный регистратор с помощью функций БД, которые вы хотите, и настройте их в бутстрапе для области электронной почты, которая является областью по умолчанию для журналов электронной почты или измените весь журнал в конфигурации класса электронной почты. См. Эту часть класса электронной почты.

1161: $contents = $this->transportClass()->send($this); 1162: if (!empty($this->_config['log'])) { 1163: $config = array( 1164: 'level' => LOG_DEBUG, 1165: 'scope' => 'email' 1166: ); 1167: if ($this->_config['log'] !== true) { 1168: if (!is_array($this->_config['log'])) { 1169: $this->_config['log'] = array('level' => $this->_config['log']); 1170: } 1171: $config = $this->_config['log'] + $config; 1172: } 1173: CakeLog::write( 1174: $config['level'], 1175: PHP_EOL . $contents['headers'] . PHP_EOL . $contents['message'], 1176: $config['scope'] 1177: ); 1178: } 

Используйте свой собственный класс – но делайте это правильно

Конечно, я могу создать класс MyCakeEmail, который расширяет собственный класс CakeEmail, но это означает, что все новые CakeEmail () все же в коде.

Хорошо, вы можете использовать свой собственный класс электронной почты. Но выполнение new SomeClass() везде в коде не является хорошим hing в любом случае IMHO. Вы просто поняли, почему. Еще одна причина не делать эту легкость тестирования.

Вместо этого сделайте это в каком-то классе на верхнем уровне цепочки извлечения (AppController, AppModel …):

 public function getEmailInstance($config = null) { return new MyEmailClass($config); } 

Это позволяет вам просто изменить класс «глобально» и издеваться над методом в тестах.

Если вы используете php 5.4 (или 5.5, не уверен прямо сейчас), вы также можете использовать черту для этого и использовать его только в классах, которые нуждаются в этой функции.