【发布时间】:2016-02-25 19:25:31
【问题描述】:
我正在制作一个可以发送电子邮件或短信的信使,并且可以现在发送或稍后发送(信息保存在数据库中)。我已经提出了 2 个解决方案,但都没有让我满意。
我是把代码集中在一个Factory中,Factory模式的代码很简单:
class MessageFactory
{
static public function get($type,$em)
{
$instance = null;
switch ($type) {
case 'email':
$instance = new EmailMessage($em);
break;
....
return $instance;
}
class EmailMessage implements MessangerInterface
{
...
public function send( $eMessage,array $receivers, $time=NULL)
{
interface MessangerInterface
{
public function send($message,array $receivers);
}
第一种解决方案:只需像普通静态方法一样调用
$messanger = Factory\MessageFactory::get('email',$em);
$messanger->send($eMessage, array('tom'=>'tom@gmail.com'));
这是一个糟糕的解决方案,因为我需要将 Doctrine Manager 作为参数传递给方法
第二个解决方案:将其用作 Symfony 2 服务
services:
my.messanger:
class: Bundle\Factory\MessangerInterface
factory_class: Bundle\Factory\MessageFactory
factory_method: get
arguments:
messanger_type: %messanger.type%
并且还将 Doctrine 作为参数传入。但是使用这样的解决方案我不能在我的代码中选择 messanger.type,它使用配置参数定义为email 或sms;我需要有代码选择类型的能力。
我还有一个问题是在课堂上我需要发送电子邮件或短信,这意味着我需要一个外部服务,得到它是这样的:
class EmailMessage implements MessangerInterface
{
if ('AppCache' == get_class($kernel)) {
$kernel = $kernel->getKernel();
}
$kernel->getContainer()->get('mailer')->send($eMessage);
这似乎是一种非常糟糕的做法。
请问,您能告诉我任何更好的解决方案吗?
我想遵循“瘦控制器胖模型”的概念。
【问题讨论】: