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

cargar modelos en un solo lugar

Estas en el tema de cargar modelos en un solo lugar en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, en mis controladores actualmente tengo que crear una instancia del modelo en cada metodo que tengo que usar por ejemplo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: ...
  #1 (permalink)  
Antiguo 30/12/2009, 15:53
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
cargar modelos en un solo lugar

Hola,
en mis controladores actualmente tengo que crear una instancia del modelo en cada metodo que tengo que usar por ejemplo:
Código PHP:
Ver original
  1. class ejemploController extends Controller{
  2. public function index(){
  3. $modelo = new ClaseModelo();
  4. $modelo->llamoaunmetodo();
  5. }
  6. public function otroMetodo(){
  7. $modelo = new ClaseModelo();
  8. $modelo->llamoaotrometodo();
  9. }
y anda todo bien
Bien en mi clase controller tengo esto:
Código PHP:
Ver original
  1. //Incluimos los modelos        
  2.  $this->Utilidades->recursiveInclude($config->get('modelsFolder'));

el codigo de recursiveInclue es :
Código PHP:
Ver original
  1. /**
  2.      * funcion para cargar recursivamente clases.
  3.      *
  4.      * @access  public
  5.      * @param string $path
  6.      */
  7.     public function recursiveInclude($path) {
  8.         if(!empty($path)){ 
  9.             $dir    = scandir($path);
  10.             if ( (is_array($dir)) && (count($dir) > 0) )
  11.             foreach($dir as $k => $v)
  12.             if ( !(is_dir($path.$v)) && ( file_exists($path.$v) ) && ($v != ".")  && ($v != "..") && (strtolower(end(explode(".", $v))) == 'php') )
  13.             include_once($path.$v);
  14.             elseif ( is_dir($path.$v) && ($v != ".") && ($v != "..") && ($v != 'smarty') )
  15.             recursiveInclude($path.$v."/");
  16.         }
  17.     }
que lo que hace es un include de todas las clases de un directorio este caso la carpeta modelos.

Bien lo que he intentado hacer (sin exito) es esto:
Código PHP:
Ver original
  1. class ejemploController extends Controller{
  2. private $modelo;
  3.         public function __construct(){
  4.             $this->modelo = new ClaseModelo();
  5.         }
  6.  
  7. public function index(){
  8. $this->modelo->metodo;
  9. }
  10. }

pero cuando hago esto me sale este error:
Fatal error: Class 'ClaseModelo' not found in D:\xampp\htdocs\ampa\admin\controladores\ejemplo\e jemploController.php on line 14
la linea 14 es:
Código PHP:
Ver original
  1. $this->modelo = new ClaseModelo();

como puedo instanciar un modelo y que se pueda usar en todos los metodos de un controlador?
desde ya muchas gracias
  #2 (permalink)  
Antiguo 30/12/2009, 16:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: cargar modelos en un solo lugar

Si te sale ese error es porque no haz incluido la clase, seguramente ejecutas eso de recursiveInclude antes de crear el controlador, revisa que ejecutes el recursiveInclude después de instanciar el controlador.

Saludos.
  #3 (permalink)  
Antiguo 30/12/2009, 16:44
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: cargar modelos en un solo lugar

deberias reemplazar el recursiveInclude por un autoload =)

http://php.net/manual/en/language.oop5.autoload.php

luego tambien podrias hacer algun tipo de factory a la que le pides el modelo, si no lo creo nunca te devuelve una nueva instancia y si ya lo habia creado te devuelve la instancia anteriormente creada

entonces en vez de hacer un new a cada rato para cada modelo puedes hacer directamente

$this->getModel('Usuarios')->update(...);

Saludos
  #4 (permalink)  
Antiguo 30/12/2009, 17:09
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: cargar modelos en un solo lugar

ok muchas gracias por la data voy a investigar un poco mas sobre lo de factory, yo lo estaba implementando asi:
Código PHP:
Ver original
  1. abstract class Controller{
  2.    
  3.     //protected $Smarty;
  4.     protected $Email;
  5.     protected $Paginador;
  6.     protected $Session;
  7.     protected $Utilidades;
  8.     protected $Imagen;
  9.     protected $Upload;
  10.     protected $Captcha;
  11.     protected $BreadCrumb;
  12.     protected $Vistas;
  13.     protected $Mensajes;
  14.    
  15.  
  16.     /**
  17.      * Constructor
  18.      *
  19.      * @access public
  20.      * @version 0.1
  21.      *
  22.      */
  23.     public function __construct()
  24.     {  
  25.        
  26.        
  27.         //creo una instancia de la configuración              
  28.         $config = Config::singleton();
  29.        
  30.         //creo la instancia para las sesiones.
  31.         $this->Session  = new Session();
  32.         $this->Session->Session();
  33.                
  34.         //creo las instancias para el email
  35.         $this->Email = new PHPMailer();
  36.         $this->Email->IsSMTP();
  37.         $this->Email->SMTPAuth   = true;                  // enable SMTP authentication
  38.         $this->Email->Host       = $config->get('host');
  39.         $this->Email->Username   = $config->get('usuario');
  40.         $this->Email->Password   = $config->get('pass');
  41.         $this->Email->Port       = $config->get('puerto');
  42.  
  43.         $this->Email->From       = $config->get('email');
  44.         $this->Email->FromName   = $config->get('nombre');
  45.                    
  46.         //creo las instancias para las utilidades varias
  47.         $this->Utilidades   = new Utilidades();                
  48.        
  49.         //creo la instancia para el captcha
  50.         $this->Captcha = new Captcha();
  51.        
  52.        
  53.         //creo la instancia para las imagenes
  54.         $this->Imagen   = new SimpleImage();
  55.        
  56.         //creo la instancia para el upload
  57.         $this->Upload   = new file_upload();
  58.        
  59.         //creo la instancia para el breadcrumb
  60.         $this->BreadCrumb   = new breadCrumbs();
  61.        
  62.         //creo la instancia de la vista
  63.         $this->Vistas   = new Vistas();
  64.        
  65.         //creo la instancia de los mensajes
  66.         $this->Mensajes = new Mensajes();
  67.              
  68.         //Incluimos los modelos        
  69.         $this->Utilidades->recursiveInclude($config->get('modelsFolder'));
  70.        
  71.        
  72.        
  73.        
  74.  
  75.     }
  76.    
  77.    
  78. }
estaría correcto si el recursive lo pongo fuera del constructor como un metodo de la clase controller?

salu2
  #5 (permalink)  
Antiguo 30/12/2009, 18:59
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: cargar modelos en un solo lugar

Si hablamos realmente de lo que este bien o este mal, el recursive include esta mal, en negrita y subrayado u.u

Por otro lado, si ponerlo como un metodo aparte o no, estarian bien ambas opciones, aunque lo mejor me parece llamarlo desde el constructor

Saludos
  #6 (permalink)  
Antiguo 30/12/2009, 19:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: cargar modelos en un solo lugar

Y el problema es ese, en tu constructor de tu controller es cuando haces el include, si quieres ejecutar el constructor del padre que heredas tienes que explicitamente llamarlo usando parent::__construct().

Saludos.
  #7 (permalink)  
Antiguo 31/12/2009, 10:59
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: cargar modelos en un solo lugar

gracias a los dos por tanto conocimiento es que uno nunca termina de aprender todo jajaja, por no decir que uno es "bruto".
Por el momento y como decimos los argentinos "lo atamos con alambre", lo solucione asi:
Código PHP:
Ver original
  1. private $CategoriasNoticias;
  2.         function __construct(){
  3.             parent::__construct();
  4.             $this->CategoriasNoticias = new CategoriasNoticias();
  5.         }
  6.         public function index(){
  7.             $this->Utilidades->validar($this->Session->get('admin'));          
  8.             $paginador = $this->Utilidades->paginador($this->CategoriasNoticias->listarCategoriasNoticias(),5);
  9.             $data['paginador'] = $paginador;
  10.             $data['breadCrumb'] = $this->BreadCrumb->listarBreadCrumb($_REQUEST);
  11.             if($this->Session->get('mensaje')){
  12.                 $data['mensaje'] = $this->Session->get('mensaje');
  13.                 $this->Session->del('mensaje');
  14.             }
  15.             $this->Vistas->show('index.html',$data);
  16.         }

no creo que sea la mejor solución pero por el momento hasta que tenga mas tiempo de investigar como lo hacen otros framework y modificarlo.
feliz año nuevo para los dos!!!!
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




La zona horaria es GMT -6. Ahora son las 06:32.