I'm planning on rewritting an application that uses Zend Framework and Twilio (for sending and receiving SMS messages). Looking back, I don't think I placed all of the SMS functionality in the right places. This has made upgrading the website difficult.
Currently, I have an SMS controller that handles requests from Twilio (for incoming messages). I implement a finite state machine (yes, in one big action method) that can handle various commands. Responses are sent directly from this controller, but also from the models that my controllers manage. Because of this, I've ended up with duplicated SMS message templates and confusion as to where exactly a message has originated.
How should I have done this? Should incoming SMS messages be parsed and processed in its own model? Currently, I don't have an SMS model - just an SMS controller. Or, what you suggest?
If it matters, I'm planning on rewriting my application using CakePHP.
I've developed more than a few ZF apps that use Twilio. I tend to either use their PHP helper library in the controller, or (if it's anything other than a simple application) wrap their helper in a service class: Application_Service_SMS
.
At that point, sending an SMS message should look like this in the controller:
$sms->send($from, $to, $body); //$sms is a service object of the twilio lib
But that's only the sending part of the question, how do you get $body
? Since you're running in an MVC framework, my suggestion would be to separate the two layers (model and view), just like you would do at any other point.
If the model determines the content of the messsage, do something like this in your controller:
$this->view->model = $model;
$body = $this->view->render('sms/' . $command . '.phtml');
You'll have to make sure the body is less that 160 characters (or split on that, and send multiple messages). And you've made the SMS message editable without changing your model (since the message is really part of the view layer).
And since with Twilio you can send SMS messages as part of a voice call's TwiML, you can also reuse that message template like this:
//inside a TwiML script
<Sms>
<?php echo $this->partial('sms/cmd.phtml', array('model' => $this->model)); ?>
</Sms>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With