【问题标题】:Where to include SMS-functionality in an MVC application?在 MVC 应用程序中在哪里包含 SMS 功能?
【发布时间】:2012-02-04 19:39:43
【问题描述】:

我正计划重写一个使用 Zend FrameworkTwilio(用于发送和接收 SMS 消息)的应用程序。回想起来,我认为我没有将所有 SMS 功能都放在正确的位置。这使得升级网站变得困难。

目前,我有一个 SMS 控制器来处理来自 Twilio 的请求(用于传入消息)。我实现了一个可以处理各种命令的有限状态机(是的,在一个大动作方法中)。响应直接从这个控制器发送,也从我的控制器管理的模型发送。因此,我最终得到了重复的 SMS 消息模板,并且对消息的确切来源感到困惑。

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

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

【问题讨论】:

标签: php model-view-controller zend-framework twilio


【解决方案1】:

我已经开发了多个使用 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,您可以将 SMS 消息作为语音呼叫的 TwiML 的一部分发送,因此您还可以像这样重用该消息模板:

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

【讨论】:

【解决方案2】:

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

正确解析后如何处理它们是控制器应该注意的事情。

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

【讨论】:

  • 好的,谢谢。所以我应该先验证控制器中的输入,然后再将其传递给模型?
  • @SimpleCoder 这取决于...它是什么样的验证?如果您验证表单输入,您应该检查控制器中的数据。如果它检查短信文本中的某些特殊字符,模型应该有一种方法来验证数据(并在发送之前在内部检查它们)。也许编写自己的验证器。它应该就像将数据插入数据库一样。可能:ModelSMS(无输入验证),ModelSMS_Reminder extends ModelSMS 检查有效的用户 ID。
  • 例如,某些命令只能从特定号码调用。此外,可以阻止数字调用命令。我很难确定它应该是模型还是控制器。
  • @SimpleCoder 看看stackoverflow.com/questions/3499336/…(链接粘贴尽可能重复),有很好的答案。但是这个特殊的例子是模型工作(通过控制器反馈来查看)。您应该将依赖项划分为 core(不应该在任何地方发生的事情)和 local(例如命令参数应该至少 20 个字符长)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2013-04-21
  • 1970-01-01
  • 2015-09-25
  • 2016-09-26
  • 1970-01-01
  • 2022-08-16
相关资源
最近更新 更多