所以我不确定到底要给大家看什么,但是如果您需要更多代码,请随时询问:
因此,此方法将在我们的应用程序中为Zend设置initMailer:
protected function _initMailer() { if ('testing' !== APPLICATION_ENV) { $this->bootstrap('Config'); $options = $this->getOptions(); $mail = new Zend_Application_Resource_Mail($options['mail']); }elseif ('testing' === APPLICATION_ENV) { //change the mail transport only if dev or test if (APPLICATION_ENV <> 'production') { $callback = function() { return 'ZendMail_' . microtime(true) .'.tmp'; }; $mail = new Zend_Mail_Transport_File( array('path' => '/tmp/mail/', 'callback'=>$callback ) ); Zend_Mail::setDefaultTransport($mail); } } return $mail; }
您可以看到其中的闭包。当我运行使用此代码的任何测试时,都会得到:
Exception: Serialization of 'Closure' is not allowed
因此,与此“关闭”相关的所有测试均失败。所以我在这里问你们我应该怎么做。
为了澄清上述内容,所有操作都是在说,我们发出的任何电子邮件都希望将有关该电子邮件的信息存储在文件/ tmp / mail /中的文件夹中。
显然,匿名函数无法序列化。
例
$function = function () { return "ABC"; }; serialize($function); // would throw error
从您的代码中,您正在使用Closure:
$callback = function () // <---------------------- Issue { return 'ZendMail_' . microtime(true) . '.tmp'; };
解决方案1: 替换为正常功能
function emailCallback() { return 'ZendMail_' . microtime(true) . '.tmp'; } $callback = "emailCallback" ;
解决方案2: 通过数组变量间接调用方法
如果您查看 http://docs.mnkras.com/libraries_23rdparty_2_zend_2_mail_2_transport_2file_8php_source.html
public function __construct($options = null) 63 { 64 if ($options instanceof Zend_Config) { 65 $options = $options->toArray(); 66 } elseif (!is_array($options)) { 67 $options = array(); 68 } 69 70 // Making sure we have some defaults to work with 71 if (!isset($options['path'])) { 72 $options['path'] = sys_get_temp_dir(); 73 } 74 if (!isset($options['callback'])) { 75 $options['callback'] = array($this, 'defaultCallback'); <- here 76 } 77 78 $this->setOptions($options); 79 }
您可以使用相同的方法发送回调
$callback = array($this,"aMethodInYourClass");