2008-09-05 26 views
18

Estoy escribiendo una aplicación web usando CodeIgniter que requiere autenticación. Creé un modelo que maneja toda mi autenticación. Sin embargo, no puedo encontrar una forma de acceder a este modelo de autenticación desde otro modelo. ¿Hay alguna manera de acceder a un modelo desde otro modo, o una forma mejor de manejar la autenticación dentro de CodeIgniter?¿Se puede acceder a un modelo desde otro modelo en CodeIgniter?

Respuesta

14

En general, no desea crear objetos dentro de un objeto. Ese es un mal hábito, en cambio, escriba una API clara e inyecte un modelo en su modelo.

<?php 
// in your controller 
$model1 = new Model1(); 
$model2 = new Model2(); 
$model2->setWhatever($model1); 
?> 
+0

¿Es esta una buena práctica? Porque el usuario de Model2 tiene que saber que depende de Model1. ¿Cuál es la buena práctica? – Sabya

+2

Sí, es una mejor práctica para "inyectar" la dependencia, en lugar de inicializar el Model2 dentro de Model1. – Till

+0

Eso no suena bien desde el punto de vista DRY. ¿Qué pasa si tengo una función que cambia un aspecto de un modelo y desencadena una acción para otro modelo? – wag2639

1

No maneje la autenticación en su modelo. Solo use modelos para interactuar con su base de datos, o ldap o lo que sea.

que crearon una biblioteca de autenticación que utilizo para gestionar la autenticación y autorización. Puede acceder a una biblioteca como esta desde sus controladores.

+0

Siempre pongo mis implementaciones oauth dentro de un modelo, no me gusta quitar mis controladores con el código de autenticación –

+0

creo un MY_controller y hago all oauth allí. – tomexsans

18

Parece puede cargar modelos dentro de los modelos, aunque probablemente debería resolver esto de otra manera. Ver CodeIgniter forums para una discusión.

class SomeModel extends Model 
{ 
    function doSomething($foo) 
    { 
    $CI =& get_instance(); 
    $CI->load->model('SomeOtherModel','NiceName',true); 

    // use $CI instead of $this to query the other models 
    $CI->NiceName->doSomethingElse(); 
    } 
} 

Además, no entiendo lo que está diciendo sobre Hasta que no se debe crear objetos dentro de objetos. Por supuesto que deberías! Enviar objetos como argumentos parece mucho menos claro para mí.

+3

La queja es que hacerlo de esa manera crea innecesariamente una dependencia más fuerte entre los dos modelos. Cuando está probando, por ejemplo, es agradable poder darle a SomeModel una versión simulada de SomeOtherModel; no puedes hacer eso si el primero carga directamente el último. O puede modificar el código más tarde para usar un modelo diferente con la misma interfaz, como cuando se refactoriza el código existente para usar un sistema de complemento. –

+1

Google tiene un marco de inyección de dependencia de código abierto. Es para Java pero explica los pros y algunos de los contras de la inyección de dependencia. http://code.google.com/p/google-guice/ –

+1

@Rob Howard Existe tal cosa como la inyección de dependencia demasiado lejos. No es necesario inyectar todos los objetos que utiliza, ya que no todos los objetos que utiliza deben probarse de forma aislada. Más bien, desea probar sistemas y módulos que funcionen juntos como un todo y que deban aislarse entre sí e inyectarse. –

1

Cargando un modelo dentro de un modelo ahora es posible con el nuevo CodeIgniter.

Cuestiones relacionadas