¿Dónde poner clases de negocio?

Hola a todos.

Esta es mi primera consulta. Es más una cuestión de procedimiento que otra cosa.

Estoy empezando con Yii y quiero hacer una aplicación que, para cargar el modelo, utiliza los datos que están en ficheros planos.

El usuario pincha en el botón ‘Crear configuración’ (configuración es un modelo, con su tabla, y con relaciones a muchos otros de los modelos de la aplicación), y entonces hay que abrir una serie de ficheros planos, parsearlos y según se van leyendo, ir rellenando diferentes modelos con los datos.

La cuestión es: ¿meto toda esa lógica en el modelo como dicen las best practices? Si es así, ¿en qué modelo?

¿No sería más práctico meter toda la lógica de parseo de ficheros en clases "aparte"?

Por otro lado: si quiero ir "informando" al usuario de los ficheros que voy procesando y los modelos que voy creando, sólo puedo hacerlo (creo, esta es la cuestión) desde un controlador, que vaya haciendo partials actualizando un campo ajax. ¿Quizás llamando a clases action independientes desde el controlador principal, y que estas a su vez vayan actualizando modelos?

¿Cómo enfocaríais este tema?

Gracias y saludos

Blas

Configuración: yii-1.1.6.r2877 en Ubuntu 10.10 x86_64 con Apache/2.2.16 (Ubuntu), PHP 5.3.3-1ubuntu9.3 y MySQL 5.1.49-1ubuntu8.1

Yo empecé poniendo lógica en los models, pero a medida que fui leyendo posts e informándome del tema lo que he hecho es crear una capa "services" que enlaza controllers y models. Por ejemplo:




class UserService

{

  function findNonActiveUsers()

  {

    // Aquí la lógica para implementar una búsqueda de usuarios inactivos

    return = User::model()->findAll( $criteriaForNonActiveUsers );

  }

}


class UserController

{

  function actionMyAction()

  {

    $userService = new UserService;

    $results = $userService->findNonActiveUsers;

    // Aquí tratar los resultados y mostrar la página adecuada

  }

}



En función de lo que que necesito, la función devuelve un CDbCriteria, un array de modelos, etc.

El objetivo de esto es que apenas añades código en models y controllers, y así si tienes que volver a generarlos no tienes que "arrastrar" demasiado código. Otra ventaja es que así es más fácil testear con PHPUnit, porque yo la verdad es que todavía no he conseguido integrar los tests de controllers: el tema de selenium no me ha quedado muy claro.

A mí de momento este enfoque me está yendo bien.

Muchas gracias por la pronta respuesta.

Este sistema de meter una capa entre los controladores y los modelos parece interesante, y desde luego ayuda a ordenar las cosas y a aislarse de actualizaciones de versión o de re-generaciones con GII; lo estudiaré más a fondo.

Pero creo que no me resuelve uno de los requerimientos: el parseo de los ficheros de texto puede ser un proceso largo y tengo que ir informando al usuario de los pasos por los que voy: "Leido fichero <tal>" "Insertados 345 <modelo>s", etc.

De momento la única forma que he visto de hacer esto es gestionando un campo AJAX desde el Controlador, pero no desde el modelo. Como las clases de la capa intermedia pertenecerían al modelo, no sé si se podría hacer desde ahí.

¿Alguna idea de cómo mantener un "diálogo" entre el modelo y la vista durante la actualización de los diferentes modelos?

Gracias de nuevo

Blas