2010-09-09 15 views
33

tengo esta sesión privada, en uno de mis controladores que comprueba si un usuario se registra en:cheque CodeIgniter para la sesión del usuario en cada controlador

function _is_logged_in() { 

    $user = $this->session->userdata('user_data'); 

    if (!isset($user)) { 
     return false; 
    } 
    else { 
     return true; 
    } 

} 

problema es que tengo más de un controlador. ¿Cómo puedo usar esta función en esos otros controladores? La redefinición de la función en cada controlador no es muy 'SECA'.

¿Alguna idea?

Respuesta

51

Otra opción es crear un controlador base. Coloque la función en el controlador base y luego herede de esto.

Para lograr esto en CodeIgniter, cree un archivo llamado MY_Controller.php en la carpeta de bibliotecas de su aplicación.

class MY_Controller extends Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function is_logged_in() 
    { 
     $user = $this->session->userdata('user_data'); 
     return isset($user); 
    } 
} 

Luego haga que su controlador herede de este controlador base.

class X extends MY_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function do_something() 
    { 
     if ($this->is_logged_in()) 
     { 
      // User is logged in. Do something. 
     } 
    } 
} 
+0

No pensé en eso, realmente me gusta la idea. Creo que es un poco más práctico que usar un ayudante. – networkprofile

+1

Mi controlador no se detecta, me sale este error: Error fatal: Class 'MY_Controller' no se encuentra en C: \ xampplite \ htdocs \ mobilehome \ application \ controllers \ links.php en la línea 3 ....... ..... alguna idea de cómo puedo cargarla automáticamente en alguna parte? ¿O debería simplemente incluirlo encima de cada controlador? – networkprofile

+3

Creo que los controladores necesitan constructores. 'function __construct() {parent :: __ construct();}' –

32

Colóquelo en un helper y autoalojelo.

ayudantes/login_helper.php:

function is_logged_in() { 
    // Get current CodeIgniter instance 
    $CI =& get_instance(); 
    // We need to use $CI->session instead of $this->session 
    $user = $CI->session->userdata('user_data'); 
    if (!isset($user)) { return false; } else { return true; } 
} 

config/autoload.php:

$autoload['helper'] = array('login'); 

Luego, en su controlador se le puede llamar:

is_logged_in(); 
+0

Como llamar en la clase de sesión desde fuera de una clase? Recibo este error con su código: Error fatal: usar $ this cuando no está en el contexto del objeto en C: \ xampplite \ htdocs \ mobilehome \ application \ helpers \ login_helper.php en la línea 4 ... ¡gracias! – networkprofile

+2

No usas '$ this' en un helper. Por favor mira nuevamente el código en la respuesta. En helpers (y bibliotecas), para usar las funciones de CodeIgniter, necesita obtener la instancia de CodeIgniter. '$ CI = & get_instance();' hace esto. En lugar de usar '$ this', use' $ CI'. –

+0

Ya veo, ¡gracias de nuevo! – networkprofile

3

Obtener todos los datos de usuario de la sesión.

En el controlador ,

$userData = $this->session->all_userdata(); 

En el Ver,

print_r($userData); 
5

se puede lograr esto usando ayudante y constructor de CodeIgniter.

  1. Puede crear my_helper.php ayudante de costumbre en que escribir su función

    function is_logged_in() { 
        $user = $this->session->userdata('user_data'); 
        if (!isset($user)) { 
        return false; 
        } 
    else { 
        return true; 
    } 
    } 
    
  2. En el controlador si su login.php

    class Login extends CI_Controller { 
    
        public function __construct() 
        { 
         parent::__construct(); 
         if(!is_logged_in()) // if you add in constructor no need write each function in above controller. 
         { 
         //redirect you login view 
         } 
        } 
    
2

Creo que el uso de ganchos se muy fácil. Simplemente cree un gancho para verificar $this->session->user. Se llamará en cada solicitud.

1

Sólo tiene que añadir esto en su carpeta de archivo de núcleo ci_controller en función __construct() para comprobar todos los controladores():

function __construct() 
{ 
    parent::__construct(); 
    if(! $user = $this->session->userdata('user_data');) 
    { 
     return false; 
    } 
} 
Cuestiones relacionadas