2012-02-04 18 views
5

Planeo reescribir una aplicación que usa Zend Framework y Twilio (para enviar y recibir mensajes SMS). Mirando hacia atrás, no creo que coloque todas las funciones de SMS en los lugares correctos. Esto ha dificultado la actualización del sitio web.¿Dónde incluir la funcionalidad SMS en una aplicación MVC?

Actualmente, tengo un controlador de SMS que gestiona las peticiones de Twilio (para mensajes entrantes). Implemento una máquina de estado finito (sí, en un gran método de acción) que puede manejar varios comandos. Las respuestas se envían directamente desde este controlador, pero también desde los modelos que administran mis controladores. Debido a esto, terminé con plantillas de mensajes de texto duplicados y confusión en cuanto a dónde se originó exactamente un mensaje.

¿Cómo debería haber hecho esto? ¿Los mensajes SMS entrantes deben analizarse y procesarse en su propio modelo? Actualmente, no tengo un modelo de SMS, solo un controlador de SMS. O, ¿qué sugieres?

Si es importante, planeo volver a escribir mi aplicación con CakePHP.

+2

Sí, debería estar en el modelo. El modelo contiene la lógica de la aplicación. La vista y el controlador forman una (de muchas posibles) interfaz de usuario para el modelo. Quieres Thin Controllers y Fat Models. – Gordon

+0

posible duplicado de [en MVC, ¿dónde traza la línea entre un controlador y modelo?] (Http://stackoverflow.com/questions/3499336/in-mvc-where-do-you-draw-the-line- entre-un-controlador-y-modelo) – Gordon

Respuesta

3

he desarrollado más de unas pocas aplicaciones que utilizan ZF Twilio. Tiendo a usar su biblioteca auxiliar de PHP en el controlador, o (si es algo más que una simple aplicación) envuelva su ayudante en una clase de servicio: Application_Service_SMS.

En ese momento, el envío de un mensaje SMS debe tener este aspecto en el controlador:

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

Pero eso es sólo la parte de envío de la pregunta, ¿cómo se consigue $body? Dado que se está ejecutando en un marco MVC, mi sugerencia sería separar las dos capas (modelo y vista), tal como lo haría en cualquier otro punto.

Si el modelo determina el contenido de la messsage, hacer algo como esto en su controlador:

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

que tendrá que asegurarse de que el cuerpo es menos que 160 caracteres (o dividida en eso, y enviar mensajes múltiples). Y ha hecho que el mensaje SMS sea editable sin cambiar su modelo (ya que el mensaje es realmente parte de la capa de visualización).

Y ya que con Twilio puede enviar mensajes SMS como parte de TwiML de una llamada de voz, también puede volver a utilizar esa plantilla de mensaje como este:

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

D'oh! ¿Por qué no pensé en usar vistas para generar los mensajes? Este es un gran enfoque, ¡gracias! –

+0

@SimpleCoder Algo que puede resultarle útil para trabajar con Zend y Twilio: http://prezi.com/aee_eujg7grb/twilio-the-zend-framework-twiliocon-2011/ –

1

La parte de la aplicación que debería ser responsable de enviar y recibir datos es modelo.

¿Qué hacer con ellos una vez que se analizan correctamente es algo que debería tener cuidado acerca de controlador.

Considero una respuesta más larga, pero esta es la respuesta a sus preguntas ... Si tiene alguna pregunta, por favor pregunte en el comentario.

+0

Ok gracias. Entonces, ¿debo validar la entrada en el controlador antes de pasarla al modelo? –

+0

@SimpleCoder Depende ... ¿Qué tipo de validación es? Si valida la entrada del formulario, debe verificar los datos en el controlador. Si se compara con algunos caracteres especiales en el texto de sms, el modelo debe tener un método para validar los datos (y verificarlos internamente antes de enviarlos). Tal vez escriba su propio validador. Debería ser más o menos como insertar datos en la base de datos. Tal vez: 'ModelSMS' (sin validación de entrada),' ModelSMS_Reminder extends ModelSMS' comprueba la identificación de usuario válida. – Vyktor

+0

Por ejemplo, ciertos comandos solo pueden invocarse a partir de números específicos. Además, los números pueden ser bloqueados para invocar comandos. Algo así es difícil para mí para determinar si debe ser modelo o controlador. –

Cuestiones relacionadas