2011-11-24 10 views
7

Digamos que en mi controlador llamado libro, que tiene muchos métodos, tales como get_book();read_book();remove_book();CodeIgniter - ¿Cómo comprobar la sesión que se utilizará en cada métodos

No hay métodos de la clase pueden ser utilizados sin que el usuario inicié sesión y puedo obtener el user_id de la sesión.

Mi pregunta es, ¿cuál es/son las mejores maneras de verificar si la sesión user_id está configurada para que pueda usar los métodos?

Por el momento estoy pensando en la creación de un método is_logged_in(), y aplicarlo a cada métodos con una sentencia if-else, como

if($this->is_logged_in() 
{ 
    //do something 
} 
else 
{ 
    //redirect to home 
} 

¿No es largo y tedioso? ¿Hay una forma definitiva de lograr esto?

leí el enlace

codeigniter check for user session in every controller

Pero parece que todavía tengo que aplicar el cheque is_logged_in en cada métodos.

¡Gracias por ayudarme!

Respuesta

11

Crear un archivo llamado MY_controller.php (el prefijo se puede editar en el archivo de configuración) en /application/core:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Controller extends CI_Controller { 


    function __construct() 
    { 

     parent::__construct(); 

     //Initialization code that affects all controllers 
    } 

} 


class Public_Controller extends MY_Controller { 

    function __construct() 
    { 
     parent::__construct(); 

     //Initialization code that affects Public controllers. Probably not much needed because everyone can access public. 
    } 

} 

class Admin_Controller extends MY_Controller { 

    function __construct() 
    { 
     parent::__construct(); 
     //Initialization code that affects Admin controllers I.E. redirect and die if not logged in or not an admin 
    } 

} 

class Member_Controller extends MY_Controller { 

    function __construct() 
    { 
     parent::__construct(); 

     //Initialization code that affects Member controllers. I.E. redirect and die if not logged in 
    } 

} 

Luego, cada vez que cree un nuevo controlador, usted decide qué acceso requiere

class Book extends Member_Controller { 

     //Code that will be executed, no need to check anywhere if the user is logged in. 
     //The user is guaranteed to be logged in if we are executing code here. 

//If you define a __construct() here, remember to call parent::__construct(); 
    } 

Esto reduce mucho la duplicación de código, ya que si necesita otro controlador miembro que no sea Book, puede ampliar el Member_Controller. En lugar de tener que hacer los controles en todos ellos.

+0

Entendí su respuesta, esto es realmente seguir el DRY y me ayuda a aplicar la regla de negocio correcta a diferentes grupos de usuarios. Gracias y @ Kemal Kernal por tu ayuda :) – user826224

9

No es necesario que haga eso. Simplemente ponga el código de verificación de inicio de sesión en el constructor ¡y listo!

class Book extends CI_Controller 
{ 
    public function __construct() 
    { 
     if ($this->is_logged_in()) 
     { 
      // redirect to home 
     } 
    } 

    public function get_book() 
    { 
     ... 
    } 

    // The rest of the code... 
} 
+0

Muchas gracias, probé y funciona sin problemas. Para ser actualizado desde el enlace es que debemos poner MY_Controller en application/core. De nuevo, gracias por tu ayuda :) ¡Que tengas un buen día! – user826224

+2

@ user826224, aún necesita duplicar el código con esto. Mi respuesta difiere mucho de la que enlazó, debe leerla cuidadosamente :) – Esailija

0

Usted puede utilizar el método en el constructor del controlador, como:

 
if (! $this->session->userdata('logged_in')) 
    { 
      redirect('login'); 
    } 

Cuestiones relacionadas