2012-02-04 95 views
5

我打算重写使用Zend FrameworkTwilio(用于发送和接收SMS消息)的应用程序。回顾一下,我不认为我将所有的SMS功能放在了正确的位置。这使网站升级变得困难。哪里可以在MVC应用程序中包含SMS功能?

目前,我有一个SMS控制器,处理来自Twilio(针对传入消息)的请求。我实现了一个可以处理各种命令的有限状态机(是的,在一个大的动作方法中)。响应直接从这个控制器发送,但也从我的控制器管理的模型发送。正因为如此,我已经结束了重复的短信消息模板,并对发送消息的确切位置感到困惑。

我该怎么做到这一点?传入的SMS消息是否应该在自己的模型中解析和处理?目前,我没有SMS模型 - 只是一个SMS控制器。或者,你建议什么?

如果很重要,我打算使用CakePHP重写我的应用程序。

+2

是的,它应该是在模型中。该模型包含应用程序逻辑。视图和控制器形成一个(许多可能的)用户界面到模型。你想要瘦控制器和胖模型。 – Gordon 2012-02-04 20:00:00

+0

[在MVC中,你可以在控制器和模型之间画线?](http://stackoverflow.com/questions/3499336/in-mvc-where-do-you-draw-the-line-在控制器和模型之间) – Gordon 2012-02-04 20:01:07

回答

3

我开发了多个使用Twilio的ZF应用程序。我倾向于在控制器中使用他们的PHP帮助程序库,或者(如果它不是简单的应用程序)将其帮助程序包装在服务类中:Application_Service_SMS

在这一点上,发送SMS消息应该是这样的控制器:

$sms->send($from, $to, $body); //$sms is a service object of the twilio lib 

但是,这只是问题的发送部分,你怎么弄$body?由于您在MVC框架中运行,我的建议是将两个图层(模型和视图)分开,就像您在任何其他位置所做的一样。

如果模型确定消息话题的内容,做这样的事情在你的控制器:

$this->view->model = $model; 
$body = $this->view->render('sms/' . $command . '.phtml'); 

你必须确保身体是小于160个字符(或分割上,和发送多个消息)。并且您已经使SMS消息可编辑而无需更改模型(因为消息实际上是视图层的一部分)。

而且,由于与Twilio您可以发送短信,语音呼叫的TwiML的一部分,你也可以重新使用像这样的消息模板:

//inside a TwiML script 
<Sms> 
    <?php echo $this->partial('sms/cmd.phtml', array('model' => $this->model)); ?> 
</Sms> 
+0

D'oh!为什么我没有想到使用视图来生成消息?这是一个很好的方法,谢谢! – 2012-02-05 19:05:44

+0

@SimpleCoder您可能会对Zend和Twilio有所帮助:http://prezi.com/aee_eujg7grb/twilio-the-zend-framework-twiliocon-2011/ – 2012-02-06 16:38:49

1

应该负责发送,接收数据的应用程序部分是模型。

一旦它们被正确解析,如何处理它们是控制器应该关心的事情。

我认为更长的答案,但这是对您的问题的答案...如果您有任何子问题,请在评论中提问。

+0

好的谢谢。所以我应该在将控制器传递给模型之前验证控制器中的输入? – 2012-02-04 20:05:36

+0

@SimpleCoder这取决于...它是什么样的验证?如果您验证表单输入,则应检查控制器中的数据。如果它检查短信文本中的某些特殊字符,模型应该有一个验证数据的方法(并在发送之前在内部检查它们)。也许写你自己的验证器。它应该与将数据插入数据库非常相似。也许:'ModelSMS'(没有输入验证),'ModelSMS_Reminder extends ModelSMS'检查有效的用户ID。 – Vyktor 2012-02-04 20:09:29

+0

例如,某些命令只能从特定的数字中调用。另外,可以阻止号码调用命令。类似这样的事情对我来说很难确定它应该是模型还是控制器。 – 2012-02-04 20:13:21

相关问题