Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePhp:结束事件后的蛋糕电子邮件_Php_Email_Cakephp - Fatal编程技术网

CakePhp:结束事件后的蛋糕电子邮件

CakePhp:结束事件后的蛋糕电子邮件,php,email,cakephp,Php,Email,Cakephp,各位早上好, 我目前正在使用CakePHP 我想在CakePHP发送电子邮件后设置一个事件,因为我想在数据库中存储此电子邮件的日志,其中包含发件人、收件人、主题和正文的单独列。 目前我正在使用本机日志系统(所有邮件的标题和正文都在同一个地方),但由于太过混乱而无法调试 CakeEmail类不提供回调方法,如果不编辑CakeEmail类,我无法调用此类事件。 当然,我可以创建一个扩展本机CakeEmail类的MyCakeEmail类,但这意味着要更改代码中的每个新CakeEmail() 你有什么建

各位早上好,

我目前正在使用CakePHP
我想在CakePHP发送电子邮件后设置一个事件,因为我想在数据库中存储此电子邮件的日志,其中包含发件人、收件人、主题和正文的单独列。
目前我正在使用本机日志系统(所有邮件的标题和正文都在同一个地方),但由于太过混乱而无法调试

CakeEmail类不提供回调方法,如果不编辑CakeEmail类,我无法调用此类事件。
当然,我可以创建一个扩展本机CakeEmail类的MyCakeEmail类,但这意味着要更改代码中的每个新CakeEmail()

你有什么建议吗?
非常感谢

(很抱歉英语不好,不是我的母语)

使用自定义记录器: 使用所需的DB功能,并在电子邮件范围(电子邮件日志的默认范围)的引导中对其进行配置,或在电子邮件类的配置中更改整个日志记录

使用您自己的类-但要正确使用 当然,我可以创建一个扩展本机CakeEmail类的MyCakeEmail类,但这意味着要更改代码中的每个新CakeEmail()

你可以使用你自己的电子邮件课程。但无论如何,在代码中的任何地方执行
newsomeclass()
都不是一件好事。你才知道为什么。另一个不做这种容易测试的原因

而是在继承链上层的某个类(AppController、AppModel…)中执行此操作:

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


如果您使用的是PHP5.4(或5.5,目前还不确定),那么您也可以使用trait,并且只在需要该功能的类中使用它。

非常感谢,burzum。您的第一个建议(自定义记录器)是我考虑过的。但是Email类正在将整个电子邮件内容传递给记录器,请参见che方法的第二个参数CakeLog::write in the code in your pasted。也许我可以解析内容中关于发送者、接收者等的独立信息,但如果存在“更聪明”的方式,我会更喜欢它。第二,建议很酷。这通常会导致更干净的代码和更容易的测试。我想用这种方法试试。谢谢扩展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:         }
public function getEmailInstance($config = null) {
    return new MyEmailClass($config);
}