0

我创建了一个需要发送电子邮件的模块,并在其 getServiceConfig 中创建了一个邮件服务作为工厂。很简单。

$transport = $this->getServiceLocator()->get('custom_module_mail_transport');
// use transport

在 Module.php 中:

          'custom_module_mail_transport' => function($instance, $sm) {
                $b    = new \Zend\Mail\Transport\Smtp();
                $b->setOptions(
                    new \Zend\Mail\Transport\SmtpOptions(
                        array(
                            'host'              => 'smtp.isp.com',
                            'connection_class'  => 'login',
                            'port'              => 25,
                            'connection_config' => array(
                                'username' => 'abc',
                                'password' => 'def',
                            )
                        )
                    )
                );
                return $b;
            },

不过,我希望人们能够自己动手,为自定义模块的邮件传输实现自己的工厂。我的意思是,我可以使用 config 来获取密码等,但是过多的传输会使这变得不好玩。

将“custom_module_mail_transport”工厂添加到应用程序级服务配置似乎并不能解决问题。目标是让用户滚动他们自己的工厂来覆盖模块提供的工厂。

最好的方法是什么?

感谢您帮助我了解 ZF2。

4

1 回答 1

2

将评论转换为答案,以便其他人可以(上/下)投票/改进。

有人可能有更好的解决方案,但我认为您可以使用允许用户定义的类类型实现您期望的通用接口的工厂。

请原谅元概述,但用户可以:

  • 在模块特定配置中配置“custom_module_mail_transport_class”=>“FQD\Of\My_Mail_Transport”的值
  • 您的服务定位器可以使用以下工厂:
    • 检查用户的 class_exists 是否存在
    • 创建一个new $passed_module_config['custom_module_mail_transport_class']()
    • 类型检查instanceof mailtransport_interface(或任何你可能命名的)
    • 如果它不是正确的实现,则创建您的标准类和/或生成异常。

但是,我还没有真正与 ZF2 合作太多。

于 2013-07-09T18:27:30.887 回答