2011-07-04 29 views
9

estoy usando CodeIgniter para mi proyecto y tengo este modelo de clases que llamo Génesis que se parece a esto:cómo heredar un modelo de otro modelo en CodeIgniter

class Genesis_model extends CI_Model { 
    function __construct() { 
     parent::__construct(); 
    } 

    function get() { 
     return 'human soul'; 
    } 
} 

y tengo otro modelo, almacenados en el mismo directorio, que se extiende Genesis_model

class Human_model extends Genesis_model { 
    function __construct() { 
     parent::__construct(); 
    } 

    function get_human() { 
     return $this->get(); 
    } 
} 

Human_model se utiliza por el controlador humano

class Human extends CI_Controller {  
    function __construct(){ 
     parent::__construct(); 
     $this->load->model('human_model'); 
    }  

    function get_human() { 
     $data['human'] = $this->human_model->get_human(); 
     $this->load->view('human/human_interface', $data); 
    } 
} 

si ejecuto el código, se producirá un error que apunta a return $ this-> get(). se lee "Error fatal: clase 'Genesis_model' no encontrado en ... \ application \ models \ human_model.php en la línea 2".

uso este método porque casi todos mis modelos compartían una estructura casi idéntica. Reúno la funcionalidad similar en Genesis, mientras que los otros modelos solo sirven como proveedores de datos únicos para las tablas que representan. funciona bien en mi asp.net (vb.net) pero no sé cómo hacerlo en codeigniter.

hay una manera para que Human_model herede Genesis_model. no creo que se me permita usar include ('genesis_model.php'). No sé si funciona tampoco.

gracias de antemano.

+0

respuestas interesantes aquí http://stackoverflow.com/questions/46338/can-you -access-a-model-from-inside-another-model-in-codeigniter – steve

Respuesta

7

Coloque el genesis_model.php archivo en el directorio central

+2

¿Pretende hacer que funcione como MY_Controller? – dqiu

+0

Sí. Puede crear tantas extensiones para sus modelos como necesite y simplemente colocarlo en/core/y usarlos a su conveniencia. –

+0

Acabo de mover genesis_model.php a/core/y renombré el nombre del archivo y el nombre de clase como MY_Controller.php y MY_Controller. pero la ejecución se detiene en $ this-> get() en Human_model con error: "Error fatal: llamada al método indefinido Human_model :: get() en ..\ application \ models \ human_model.php " ¿Perdí algo? – dqiu

1

tiene que incluir la Genesis_model en su Human_model.php así:

include_once(APPPATH . 'folder/file' . EXT); 

O puede cargar automáticamente en el archivo de configuración/autoload.php, lo que creo que es estúpida =)

4

cambiar su Human_model a esto:

include('genesis_model.php'); 
class Human_model extends Genesis_model { 
    function __construct() { 
     parent::__construct(); 
    } 

    function get_human() { 
     return parent::get(); 
    } 
} 

aviso de la función y la get_humaninclude.

6

núcleo/MY_Model es bueno si sólo hay 1 superclase importante para sus modelos.

Si desea heredar de más de la superclase del modelo, una mejor opción es cambiar la configuración de autocarga.

En application/config/autoload.php, añada esta línea:

$autoload['model'] = array('genesis_model'); 
+2

Creo que esta respuesta es exactamente lo que quiere el autor de la pregunta. Ya tengo un MY_Model y quiero ampliar ese MY_Model en ME_Model. Al colocar el ME_Model en la aplicación/modelos y cargarlo automáticamente como se sugirió anteriormente, puedo lograr este objetivo. –

+0

¿Qué directorio busca la carga automática? ? Puse mi segunda clase de modelo en el directorio central y puse el nombre de clase en autocarga, un error dijo que la clase no se puede encontrar. – tingfungc

+0

@tingfungc Esto cargará cualquier modelo disponible en su aplicación, generalmente en 'application/models/'. – Siphon

1

otra solución

<?php 
$obj = &get_instance(); 
$obj->load->model('parentModel'); 
class childModel extends parentModel{ 
    public function __construct(){ 
     parent::__construct(); 
    } 

    public function get(){ 
     return 'child'; 
    } 
} 
?> 
Cuestiones relacionadas