ZF2 - 可以覆盖工厂吗?

时间:2013-07-09 15:38:08

标签: php zend-framework2

我创建了一个需要发送电子邮件的模块,并在其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;
            },

我希望人们能够自己动手,为自定义模块的邮件传输实现自己的工厂。我的意思是,我可以使用配置来获取密码等等,但过多的传输会使这一点无法解决。

将“custom_module_mail_transport”工厂添加到应用程序级服务配置似乎不起作用。目标是让用户滚动自己的工厂来覆盖模块提供的工厂。

最好的方法是什么?

感谢您帮助我绕过ZF2。

1 个答案:

答案 0 :(得分: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。