Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO duda de concepto en MVC

Estas en el tema de duda de concepto en MVC en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas estoy desarrollando un pequeño sistema por lo que no trabaje con ningun framework sino que tengo digamos un mini marco de trabajo con mis ...
  #1 (permalink)  
Antiguo 11/03/2011, 20:29
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
duda de concepto en MVC

Buenas estoy desarrollando un pequeño sistema por lo que no trabaje con ningun framework sino que tengo digamos un mini marco de trabajo con mis clases y un poco de MVC, pero tengo una duda grande, segun lo que yo entendia porlo que veia al momento de trabajar con cakePHP la logica aca practicamente esta en el controlador y el modelo se encarga unicamente de lo que es el trabajo con los datos (esto segun lo que yo veo si estoy equivocado regañenme y corrijan lo que estoy diciendo), ya que en el modelo solo se declara las relaciones con las base de datos y un poco de validacion como dije segun veo en lo poco que me he podido adentrar en este fw, entonces releyendo porque quiero hacer las cosas bien y estar claro en lo que a MVC se refiere hice mi minimarco pero me queda la duda, debo hacer la logica en el controlador y el modelo, por ejemplo suponiendo que tengo un controlador y un modelo para el usuario
UsuarioController
Código PHP:
Ver original
  1. public function login()
  2.     {
  3.         $this->model = new UsuarioModel();
  4.         $user = $this->model->find('usuario',array('usuario'=>$_POST['usuario']));
  5.         if(count($user) == 0){
  6.             $_SESSION['errorUsuario'] = "no_esta";
  7.             header("location:".$_SERVER['PHP_SELF']);
  8.             exit;
  9.         }
llamando al model y trabajando el model como lo hace cake incluido en el controlador?? o tengo que hacer esta logica en el modelo y solo hacer el llamado desde el controlador?? creo que me volvi a perder entre tanta lectura porque algunos autores hablan que la logica esta en el controlador y otros en el modelo, a quien creerle?? saludos y gracias por las respuestas que me puedan brindar
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #2 (permalink)  
Antiguo 11/03/2011, 22:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 14 años
Puntos: 2135
Respuesta: duda de concepto en MVC

La logica siempre debe de tratarse en el modelo, y esto es porque más de 1 controlador puede usar tu modelo, si la logica la incluyes en el modelo, cuando quieras hacer algo diferente tendrías que copiar el contenido de tu controller.

Es por eso que siempre se recomienda que la relación sea de modelo (capa de negocios) al controlador, y que uno o más controladores puedan leer este modelo y siempre actuen igual.

Te recomiendo leer este pequeño articulo que si bien no es PHPOO (es Ruby) habla muy bien de porque la logica debe de pertenecer al modelo: http://weblog.jamisbuck.org/2006/10/...ller-fat-model

Saludos.
  #3 (permalink)  
Antiguo 12/03/2011, 07:40
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
Respuesta: duda de concepto en MVC

gracias por la explicacion y el artículo cre que me quedo un poco mas claro, aunque me costo un poco porque mi ingles no es muy bueno (casi nulo ) pero con el traductor de google me ayude creo que aunque estava en ruby que nunca me he preocupado por manejar creo que la explicacion es muy generica para cualquier lenguaje, entonces todo lo que es la logica de comparacion y todo de mi login deberia de estar es en el modelo y solo llamar a un metodo de busqueda de usuarios y segun sea la respuesta de este ir a la vista correspondiente?? gracias por tu ayuda creo que ahora si estoy un poco mas claro, pero entonces me queda la duda hay mucho fw que trabajan la logica en el controlador por lo que no estarian aplicando correctamente el MVC aunque funcionen de manera correcta lo que se haga en ellos o estoy equivocado???
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Última edición por carlos_belisario; 12/03/2011 a las 12:53
  #4 (permalink)  
Antiguo 12/03/2011, 12:54
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
Respuesta: duda de concepto en MVC

se me acaba de generar una duda, la validación en este patrón entonces en donde la haria directamente en el modelo donde esta toda la logica cierto, entonces las acciones del controlador serian unicamente para pasar los datos de la vista al modelo y visceversa??

habia editado pero asi nadien se va a dar cuenta de la ultima duda del tema
__________________
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 12/03/2011, 14:20
Avatar de NUCKLEAR
Moderador radioactivo
 
Fecha de Ingreso: octubre-2005
Ubicación: Cordoba-Argentina
Mensajes: 5.688
Antigüedad: 14 años, 7 meses
Puntos: 890
Respuesta: duda de concepto en MVC

Siguiendo estrictamente el patron la logica diria que si. Es lo que pienso.

Personalmente me gusta mas la idea de tener una carpeta con funciones en comun validadores, generadores de url's, etc. (Y lo que normalmente se hace)

Y simplemente no terminar cargando un modelo con algo que se voy a necesitar en toda la aplicacion.

A menos claro esta de que el validador solo se requiera en un caso en particular.
__________________
Drupal Argentina
  #6 (permalink)  
Antiguo 12/03/2011, 15:06
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
Respuesta: duda de concepto en MVC

Cita:
Iniciado por NUCKLEAR Ver Mensaje
Siguiendo estrictamente el patron la logica diria que si. Es lo que pienso.

Personalmente me gusta mas la idea de tener una carpeta con funciones en comun validadores, generadores de url's, etc. (Y lo que normalmente se hace)

Y simplemente no terminar cargando un modelo con algo que se voy a necesitar en toda la aplicacion.

A menos claro esta de que el validador solo se requiera en un caso en particular.
gracias por tu respuesta amigo me quitaste la duda que tenia , bueno yo tengo algunas funciones donde valido por tipo de dato y por campo vacio lo que tenia pensado es incluir estas en el modelo o controlador segun me terminaran de guiar ustedes y unicamente llamar a esta dependiendo del caso, saludos y gracias nuevamente
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #7 (permalink)  
Antiguo 12/03/2011, 15:59
Avatar de historiasdemaria  
Fecha de Ingreso: septiembre-2010
Ubicación: www
Mensajes: 433
Antigüedad: 9 años, 8 meses
Puntos: 54
Respuesta: duda de concepto en MVC

Un ejemplo muy claro de esto es la validacion de un email, entonces para no escribir cada vez la misma funcion para las clases que traten con un email, normalmente yo escribo una clase tipo Tools, como MiproyectoTools, luego se llama a sus metodos donde se necesite una validacion y ya esta
  #8 (permalink)  
Antiguo 12/03/2011, 16:20
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
Respuesta: duda de concepto en MVC

gracias por la respuesta amigo, eso mismo estava pensando implementar una clase donde tenga mis validaciones y solo llamarlas y llamar a sus metodos dependiendo al caso, gracias
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #9 (permalink)  
Antiguo 12/03/2011, 16:20
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 4 meses
Puntos: 845
Respuesta: duda de concepto en MVC

Que tal carlos_belisario,

Algo parecido se comento hace un tiempo, te dejo el link, http://www.forosdelweb.com/f68/valid...-model-876569/.
Creo que deberías refactorizar tus funciones de validación, a clases y luego dependiendo de la aplicación decides donde validar, a nivel de modelos, formulario, service layer o en todos :).
Te podes guiar por como lo manejan los diferentes frameworks, en Yii por ejemplo, podes definir un set de reglas en el modelo contra las que se validara posteriormente, te dejo la referencia para que te hagas una idea, en Zend es normal hacer la validación en el formulario, otro approach interesante, con el que he estado probando ultimamente es utilizar annotations + reflection, es algo interesante pero todavía no me convence del todo y seguramente hay mas, pero bueno espero te de una idea general de lo que se puede hacer.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 12/03/2011, 16:28
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
Respuesta: duda de concepto en MVC

excelente vi por encima la referencia que me dejaste de yii y me parece que maneje algo parecido con cake, entonces tendria que crear una clase para estas validaciones e incluirla en los modelos o me equivoco?? de echo creo que cuando lo trabajaba en cake podia definir mi propia regla con una exprecion regular que es lo que normalmente segun he leido se establece para ello, muchas gracias por las referencias voy a tomar un poco de las lecturas que me dejaste y a trabajar en ello
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #11 (permalink)  
Antiguo 13/03/2011, 20:57
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
Respuesta: duda de concepto en MVC

un poco fastidiado el dia de hoy me puse a trabajr un poco en la clase que me indicaban, las validaciones las hace segun lo que he colocado, pueden hacerme todas las criticas posibles
Código PHP:
Ver original
  1. <?php
  2. /**
  3. clase para realizar validaciones en el modelo
  4. */
  5. class Validacion
  6. {
  7.     public $mensaje;
  8. /**
  9. declaramos la regla de validacion
  10. */
  11.     public function rules($rule = array(),$data)
  12.     {
  13.        
  14.         if(!is_array($rule)){
  15.             $this->mensaje = "las reglas deben de estar en formato de arreglo";
  16.             return $this;
  17.         }      
  18.         foreach($rule as $key => $rules){
  19.             $reglas = explode(',',$rules['regla']);
  20.             if(array_key_exists($rules['name'],$data)){
  21.                 foreach($data as $indice => $valor){                   
  22.                     if($indice === $rules['name']){
  23.                         foreach($reglas as $clave => $valores){                                        
  24.                             if($valores === "no-empty"){                               
  25.                                 $respuesta = $this->_noEmpty($rules['name'],$valor);
  26.                             }
  27.                             if($valores === "numeric"){                            
  28.                                 $respuesta = $this->_numeric($rules['name'],$valor);
  29.                             }
  30.                             elseif($valores === "email"){
  31.                                 $respuesta = $this->_email($rules['name'],$valor);
  32.                             }
  33.                         }
  34.                         break;
  35.                     }
  36.                 }
  37.             }
  38.             else{
  39.                 $this->mensaje[$rules['name']] = "el campo $value no esta dentro de la regla de validación o en el formulario";               
  40.             }
  41.         }      
  42.         if(!$respuesta){
  43.             return $this;
  44.         }
  45.     }  
  46.     /**
  47.     metodo para verificar si esta vacio el campo
  48.     */
  49.     protected function _noEmpty($campo,$valor)
  50.     {      
  51.         if(isset($valor) && !empty($valor)){           
  52.             return true;           
  53.         }
  54.         else{          
  55.             $this->mensaje[$campo][] = "el campo $campo debe de estar lleno";
  56.             return false;
  57.         }
  58.     }
  59.     /**
  60.     metodo para verificar que el campo sea numerico
  61.     */
  62.     protected function _numeric($campo,$valor)
  63.     {      
  64.         if(is_numeric($valor)){
  65.             return true;
  66.         }      
  67.         else{
  68.             $this->mensaje[$campo][] = "el campo $campo debe de ser numerico";
  69.             return false;
  70.         }
  71.     }
  72.     /**
  73.     metodo para verificacion de email
  74.     */
  75.     protected function _email($campo,$valor)
  76.     {
  77.         if(preg_match("/^[a-z]+([\.]?[a-z0-9_-]+)*@[a-z]+([\.-]+[a-z0-9]+)*\.[a-z]{2,}$/",$valor)){    
  78.             $this->mensaje[$campo][] = "el campo $campo de estar en el formato de email [email protected]";
  79.             return false;
  80.         }      
  81.     }
  82. }
  83. /*pruebas basicas a la clase sin incluirla en el modelo*/
  84. $_POST['campo1'] = 1;
  85. $_POST['campo2'] = "[email protected]";
  86. $datos = $_POST;
  87. $validacion =  new Validacion();
  88. $regla = array(
  89.             array('name'=>'campo1','regla'=>'no-empty,numeric'),
  90.             array('name'=>'campo2','regla'=>'no-empty,email')
  91.         );
  92. $validaciones = $validacion->rules($regla,$datos);
  93. print_r($validaciones);
  94. ?>

ahora bien, esta clase la incluyo en la clase modelo base de tal manera que pueda realizar la validaciones directamente llamando a el metodo rules de esta clase o que me pueden aconcejar, gracias de nuevo
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #12 (permalink)  
Antiguo 15/03/2011, 17:18
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 4 meses
Puntos: 845
Respuesta: duda de concepto en MVC

Que tal carlos_belisario,

Creo que los validators deberian ser clases separadas(con la interfaz correspondiente), podes ver el componente de Zend, Zend_Validator para que te hagas una idea, o en su defecto deberias tener un inflector(bien podria ser una clase tambien) en Validación para resolver el nombre de las funciones, porque cada vez que quieras agregar un nuevo validator vas a tener que agregar un if, algo bastante incomodo.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #13 (permalink)  
Antiguo 15/03/2011, 18:19
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
Respuesta: duda de concepto en MVC

Cita:
Iniciado por masterpuppet Ver Mensaje
Que tal carlos_belisario,

Creo que los validators deberian ser clases separadas(con la interfaz correspondiente), podes ver el componente de Zend, Zend_Validator para que te hagas una idea, o en su defecto deberias tener un inflector(bien podria ser una clase tambien) en Validación para resolver el nombre de las funciones, porque cada vez que quieras agregar un nuevo validator vas a tener que agregar un if, algo bastante incomodo.

Saludos.
gracias por tus apreciaciones sobre como debo mejorar lo que hice , voy a estudiar un poco lo que me indicaste y me coloco a hacer la clase creo que voy a tomar un poco el ejemplo de Zend_Validator que me hablaste, voy a revisar las librerias de Zend para guiarme un poco, además voy a investigar un poco mas el tema del inflector, ya que según lo que pude leer un poco en mi investigación del termino, mayormente resultados de ruby el inflector lo usan para la transformación de palabras para las conexiones con las db, ahora mi duda aunque tonta e ignorante pero duda al fin en que me ayudaria hacer el inflector?? ojo voy a seguir investigando el tema porque me parecio muy interesante gracias por la ayuda y la enseñanza que estas dando amigo masterpuppet , 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
  #14 (permalink)  
Antiguo 15/03/2011, 18:48
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 4 meses
Puntos: 845
Respuesta: duda de concepto en MVC

El inflector lo que haria seria transformar los string del array rules, tal cual lo estas planteando las funciones para validar empiezan por undescore y utilizan lowercamelcase y en el array de rules vienen con el formato no-empty, numeric, la idea seria transformar el no-empty en _noEmpty, numeric en _numeric, esto:

Código PHP:
Ver original
  1. if($valores === "no-empty"){                                
  2.     $respuesta = $this->_noEmpty($rules['name'],$valor);
  3. }
  4. if($valores === "numeric"){                            
  5.     $respuesta = $this->_numeric($rules['name'],$valor);
  6. }
  7. elseif($valores === "email"){
  8.     $respuesta = $this->_email($rules['name'],$valor);
  9. }
podria ser algo asi:
Código PHP:
Ver original
  1. $validator = $this->_getInflectedName($valores);
  2. if(!is_callable(array($this, $validator))){
  3.    throw new BadMethodCallException(/*...*/);
  4. }
  5. $respuesta = $this->$validator($rules['name'], $valor);

La ventaja es que al crear nuevos validators, cosa que seguro ocurrira, no tendras que estar agregando if's.

Agregado:

otra sugerencia carlos, el nombre de las clases, metodos y variables deberia ser homogéneo, elegi español o ingles y apegate a ello.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 15/03/2011 a las 18:56
  #15 (permalink)  
Antiguo 15/03/2011, 18:59
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
Respuesta: duda de concepto en MVC

Cita:
Iniciado por masterpuppet Ver Mensaje
El inflector lo que haria seria transformar los string del array rules, tal cual lo estas planteando las funciones para validar empiezan por undescore y utilizan lowercamelcase y en el array de rules vienen con el formato no-empty, numeric, la idea seria transformar el no-empty en _noEmpty, numeric en _numeric, esto:

Código PHP:
Ver original
  1. if($valores === "no-empty"){                                
  2.     $respuesta = $this->_noEmpty($rules['name'],$valor);
  3. }
  4. if($valores === "numeric"){                            
  5.     $respuesta = $this->_numeric($rules['name'],$valor);
  6. }
  7. elseif($valores === "email"){
  8.     $respuesta = $this->_email($rules['name'],$valor);
  9. }
podria ser algo asi:
Código PHP:
Ver original
  1. $validator = $this->_getInflectedName($valores);
  2. if(!is_callable(array($this, $validator))){
  3.    throw new BadMethodCallException(/*...*/);
  4. }
  5. $respuesta = $this->$validator($rules['name'], $valor);

La ventaja es que al crear nuevos validators, cosa que seguro ocurrira, no tendras que estar agregando if's.

Saludos.
Magistral!!!! tu explicacion sobre como me ayudaria el inflactor en este caso y me ahorro todos los if que cree, entonces me sugieres que el inflactor sea una clase o seria mejor un metodo mas?? gracias por tu ayuda amigo masterpuppet
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #16 (permalink)  
Antiguo 15/03/2011, 20:09
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 4 meses
Puntos: 845
Respuesta: duda de concepto en MVC

En una primera instancia un metodo en la clase deberia ser suficiente.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #17 (permalink)  
Antiguo 16/03/2011, 20:25
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 10 años, 1 mes
Puntos: 461
Respuesta: duda de concepto en MVC

bueno segui el concejo del amigo masterpuppet e hice el metodo inflector para la clase aca va no se si este muy ortodoxo pero funciona,

Código PHP:
Ver original
  1. private function _getInflectedName($text)
  2.     {
  3.         $_validator = preg_replace('/[^A-Za-z0-9]+/',' ',$text);
  4.         $arrayValidator = explode(' ',$_validator);            
  5.         if(count($arrayValidator) > 1){
  6.             foreach($arrayValidator as $key => $value){                
  7.                 if($key == 0){
  8.                     $validator .= "_".$value;  
  9.                 }
  10.                 else{                  
  11.                     $validator .= ucwords($value);
  12.                 }
  13.             }
  14.         }
  15.         else{
  16.             $validator = "_".$_validator;
  17.         }              
  18.         return $validator;
  19.     }

gracias al amigo masterpuppet por la paciencia y la enseñanza en esto que no conocia y a los demás amigos que me orientaron tambien en el tema del MVC, gracias saludos


edito aca dejo un link de un inflector de zend, despues que me puse a hacer el metodo de mi clase , pero puede servir, aunque hay que hacerle algunas pruebas ya que en la prueba que hice el metodo camelize no funciono correctamente creo que por el resultado del preg_replace
Cita:
preg_replace('/[^A-Z^a-z^0-9]+/'
saludos y gracias por la ayuda nuevamente
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Última edición por carlos_belisario; 17/03/2011 a las 11:22
  #18 (permalink)  
Antiguo 20/03/2011, 18:57
Avatar de IvanAsturS  
Fecha de Ingreso: enero-2011
Ubicación: Asturias
Mensajes: 24
Antigüedad: 9 años, 4 meses
Puntos: 2
Respuesta: duda de concepto en MVC

Me ha parecido muy interesante todo lo comentado en el post. Este es un tema en el que me estoy "actualizando" y he aprendido cosas. Muchas gracias a todos!

Un saludo

Etiquetas: concepto, 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 4 personas




La zona horaria es GMT -6. Ahora son las 11:01.