Foros del Web » Programando para Internet » PHP »

MVC - modelos que se repiten?

Estas en el tema de MVC - modelos que se repiten? en el foro de PHP en Foros del Web. Hola buenas, Sigo con mi aprendizaje con MVC, y tengo la siguiente duda.. SI tengo 4 acciones y las 4 requieren el mismo modelo... se ...
  #1 (permalink)  
Antiguo 27/04/2011, 01:47
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
MVC - modelos que se repiten?

Hola buenas,

Sigo con mi aprendizaje con MVC, y tengo la siguiente duda..

SI tengo 4 acciones y las 4 requieren el mismo modelo... se puede incluir dicho modelo antes de las acciones?

Lo mismo para controlar si un usuario esta logeado.. donde controlo la sesión? en cada acción? o antes de definirlas?

Un saludo y gracias!
  #2 (permalink)  
Antiguo 27/04/2011, 15:03
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: MVC - modelos que se repiten?

miktrv, yo tambien estoy iniciando con POO y MVC, pero algo voy aprendiendo.

La idea es que puedas crear un objeto (o modelo) para cada tabla y puedas utilizarlo en cualquier parte donde lo necesites, entonces, con un solo modelo para esas 4 acciones es mas que suficiente.

Yo, como principiante, estoy buscando la forma de simplificarme un poco las cosas, teniendo un solo controlador para todas las acciones de un mismo modulo, usando un "router" interno para definir el metodo a ejecutar.

Tendras que cargar y verificar sesiones desde el inicio (frontController), antes de realizar cualquier accion y, en cada controlador, deberas comprobar los permisos de acuerdo al nivel de usuario (invitado, registrado, admin, etc.).
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 27/04/2011, 15:34
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: MVC - modelos que se repiten?

Cita:
Iniciado por Triby Ver Mensaje
miktrv, yo tambien estoy iniciando con POO y MVC, pero algo voy aprendiendo.

La idea es que puedas crear un objeto (o modelo) para cada tabla y puedas utilizarlo en cualquier parte donde lo necesites, entonces, con un solo modelo para esas 4 acciones es mas que suficiente.

Yo, como principiante, estoy buscando la forma de simplificarme un poco las cosas, teniendo un solo controlador para todas las acciones de un mismo modulo, usando un "router" interno para definir el metodo a ejecutar.

Tendras que cargar y verificar sesiones desde el inicio (frontController), antes de realizar cualquier accion y, en cada controlador, deberas comprobar los permisos de acuerdo al nivel de usuario (invitado, registrado, admin, etc.).
Hola buenas,


Muchas gracias por tu respuesta.

Esto lo tengo controlado, pero lo que no comprendo es lo siguiente:


imaginemos que tengo un controlador de noticias_

function index() {

//listar noticias

function view

//listar una noticia

function best

//listar las noticias mas votadas


todas estas funciones, usan el modelo noticias.. tengo que hacer un require de este modelo dentro de cada función?

Un saludo!
  #4 (permalink)  
Antiguo 27/04/2011, 17:58
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: MVC - modelos que se repiten?

bueno deberias de cargar el modelo a un atributo de manera que puedas acceder a esta desde cualquier parte de tu clase. Saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #5 (permalink)  
Antiguo 27/04/2011, 18:37
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: MVC - modelos que se repiten?

Bueno, depende de como estas programando, si usas, por ejemplo el patron Singleton, solo obtienes la instancia del modelo, ya sea en el mismo controlador o en cada una de las funciones donde lo requieras.

Por ejemplo, to modelo podria tener algo como:
Código PHP:
Ver original
  1. class modelo {
  2.     private static $_instance = false;
  3.     private function __construct() {} // Privado para evitar crear instancias desde fuera
  4.     public static function getInstance() {
  5.         if(self::$_instance === false) {
  6.              // No se ha creado una instancia
  7.              self::$_instance = new self();
  8.         }
  9.         return self::$_instance;
  10.     }
  11.     // Aqui el resto de funciones para acceso a la tabla
  12. }

En tu controlador puedes tener algo como:
Código PHP:
Ver original
  1. class controlador {
  2.     private $_modelo = false;
  3.     public function __construct() {
  4.          // Si no has incluido el script para el modelo
  5.          include 'ruta/modelo.php';
  6.          $this->_modelo = modelo::getInstance();
  7.     }
  8.     public function nuevasNoticias() {
  9.         $noticias = $this->_modelo->leerNoticias(/* parametros, si se necesitan */);
  10.         // Aqui ejecutas la vista
  11.     }
  12. }
  13.  
  14. // O bien... podrias obtener la instancia del modelo en cada funcion:
  15. class controlador {
  16.     public function __construct() {
  17.          // Si no has incluido el script para el modelo
  18.          include 'ruta/modelo.php';
  19.     }
  20.     public function nuevasNoticias() {
  21.         $noticias = modelo::getInstance()->leerNoticias(/* parametros, si se necesitan */);
  22.         // Aqui ejecutas la vista
  23.     }
  24. }

Esto podria ser util si en la misma pagina (mismo o diferente controlador) debes tener acceso al modelo y requieres que sea solo una instancia del modelo.

Si requieres dos o mas instancias (depende mucho de que estes haciendo), entonces tendras que buscar informacion sobre Factory, en lugar de Singleton.

Por otra parte, en tu controlador frontal podrias crear una funcion que cargue los archivos y clases que requieras, de manera que puedas, por ejemplo:

Código PHP:
Ver original
  1. // Si es una funcion estatica:
  2. $modelo = frontController::loadClass('ruta/archivo.php', 'nombre_de_la_clase');
  3.  
  4. // Y la funcion seria algo como:
  5. public static function loadClass($file, $class) {
  6.     if(file_exists($file)) {
  7.          include_once $file;
  8.     } else {
  9.          // Aqui lanzas una excepcion
  10.     }
  11.     if(class_exists($class)) {
  12.          // Supongamos que es con Singleton:
  13.          return $class::getInstance();
  14.     } else {
  15.         // Aqui lanzas una excepcion
  16.     }
  17. }

Ojo, esto es de un aprendiz a otro, asi que puede que mis sugerencias no sean las mas adecuadas, pero podrian serte de utilidad.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 27/04/2011, 19:29
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: MVC - modelos que se repiten?

Me parece miktrv que te estas mareando con algo, que en realidad es simple, no deberías tener require's, para eso esta el autoload, luego lo que se suele hacer es lo que comentan carlos_belisario y Triby declararlo como propiedad, para mi no es lo mas limpio, pero para casos simples sirve(prefiero un service layer sobre el domain model).
Otra opción es utilizar Reflection + Annotations, yo lo suelo utilizar cuando estoy armando el prototipo de la aplicación.

Con respecto a Singleton para los modelos, no me parece una buena idea, en realidad opino(al igual que mucha gente) que Singleton es un anti-pattern, si es necesaria una instancia única de un objeto debería resolverse a nivel de la aplicación, no de la clase, te sugiero, que en la medida de lo posible lo evites.

@Triby, para que sea realmente un Singleton tenes que definir __clone como private.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 28/04/2011, 02:59
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: MVC - modelos que se repiten?

Cita:
Iniciado por masterpuppet Ver Mensaje
Me parece miktrv que te estas mareando con algo, que en realidad es simple, no deberías tener require's, para eso esta el autoload.
Hola buenas, muchas gracias a todos por vuestras respuestas. Tienes razón con este punto, el problema estaba en que mis modelos no son clases, si no funciones separadas... yo ya uso un autoload que tu mismo me sugeriste en post anteriores.

No se muy bien como trabajar con modelos que sean clases.. supongo que es lo mismo..

Si alguien puede poner un ejemplo fácil lo agradecería!

Gracias!
  #8 (permalink)  
Antiguo 28/04/2011, 05:36
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: MVC - modelos que se repiten?

Cita:
Iniciado por miktrv Ver Mensaje
Hola buenas, muchas gracias a todos por vuestras respuestas. Tienes razón con este punto, el problema estaba en que mis modelos no son clases, si no funciones separadas... yo ya uso un autoload que tu mismo me sugeriste en post anteriores.

No se muy bien como trabajar con modelos que sean clases.. supongo que es lo mismo..

Si alguien puede poner un ejemplo fácil lo agradecería!

Gracias!
Seria mejor que postearas tu controller, para poder sugerirte correctamente alguna estrategia a seguir.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 28/04/2011, 06:36
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: MVC - modelos que se repiten?

Hola buenas,

Mi controlador sería:

controlador.loquesea.php

Código PHP:
function index() {

  
//modelo
  
require_once('model.loquesea.php');

  
//implementación
  
...

}

function 
view() {

  
//modelo
  
require_once('model.loquesea.php');

  
//implementación
  
...


Un saludo!

Etiquetas: modelos, mvc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 21:47.