2012-02-04 94 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

相關問題