繁体   English   中英

CakePhp:Cake Email AfterSend事件

[英]CakePhp: Cake Email AfterSend event

大家早上好,

我目前正在使用CakePHP。
我希望在CakePHP发送电子邮件后设置一个事件,因为我想在数据库中存储此电子邮件的日志,其中包含发件人,接收者,主题和正文的单独列。
目前我正在使用本机日志系统(电子邮件的所有标题和正文在同一个地方),但是调试变得太乱了。

CakeEmail类不提供回调方法,我没有找到任何方法来调用这种事件而不编辑CakeEmail类。
当然,我可以创建扩展本地CakeEmail类MyCakeEmail类,但这意味着要改变每一个新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:         }

使用你自己的课 - 但做得对

当然我可以创建一个扩展本地CakeEmail类的MyCakeEmail类,但这意味着在代码中更改每个新的CakeEmail()。

那么你可以使用自己的电子邮件类。 但是在代码中到处都是new SomeClass()在任何情况下都不是好事。 你只知道原因。 另一个不容易测试的原因。

而是在继承链的上层(AppController,AppModel ...)的某些类中执行此操作:

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

这允许您简单地“全局”更改类,并在测试中模拟方法。

如果您使用的是PHP 5.4(或5.5,现在还不确定),您也可以使用它的特性,并仅在需要该功能的类中使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM