2011-11-24 4 views
7

diciamo a mio controller di nome Libro, ho molti metodi, come ad esempio get_book();read_book();remove_book();CodeIgniter - Come controllare la sessione per essere utilizzato in ogni metodi

Non ci sono metodi della classe può essere utilizzato senza utente loggato, e posso ottenere il user_id dalla sessione.

La mia domanda è, quali sono/sono i modi migliori per verificare se la sessione user_id è impostata in modo che sia possibile utilizzare i metodi?

Come per ora sto pensando di creare un metodo di is_logged_in(), e applicarlo a ogni modalità con un'istruzione if-else, come

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

Non è forse lungo e noioso? C'è un modo ultimo per raggiungere questo obiettivo?

Ho letto il link

codeigniter check for user session in every controller

Ma sembra che ho ancora di applicare il controllo is_logged_in ad ogni metodi.

Grazie per avermi aiutato!

risposta

11

Creare un file chiamato MY_controller.php (il prefisso può essere modificato nel file di configurazione) in /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 
    } 

} 

Quindi, ogni volta che crei un nuovo controller, decidi quale accesso richiede

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(); 
    } 

Questo riduce notevolmente la duplicazione del codice, poiché se è necessario un altro controller membro diverso da Book, è sufficiente estendere lo Member_Controller. Invece di dover fare i controlli in tutti loro.

+0

Ho capito la tua risposta, questo è davvero seguire il DRY e mi aiuta ad applicare la corretta regola aziendale a diversi gruppi di utenti. Grazie a te e @Kemal Kernal per il tuo aiuto :) – user826224

9

Non devi necessariamente farlo. Inserisci semplicemente il codice di controllo login nel costruttore e sei pronto!

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

Grazie mille, ho provato e funziona perfettamente. Per essere aggiornato dal link è necessario mettere MY_Controller sotto application/core. Ancora una volta, grazie per il tuo aiuto :) Buona giornata! – user826224

+2

@ user826224, è ancora necessario duplicare il codice con questo. La mia risposta è molto diversa da quella che hai collegato, dovresti leggerlo attentamente :) – Esailija

0

È possibile utilizzare il metodo nel costruttore del controllore, come:

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

Problemi correlati