Let say at my controller named Book, I have many methods, such as
get_book();
read_book();
remove_book();
You don't necessarily need to do that. Simply put the login check code in the constructor and you're all set!
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...
}
You can use the method in constructor of controller, like:
if ( ! $this->session->userdata('logged_in')) { redirect('login'); }
Create a file called MY_controller.php
(the prefix can be edited in config file) 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
}
}
Then anytime you create a new controller, you decide what access it requires
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();
}
This cuts code duplication a lot, since if you need another member controller other than Book
you can just extend the Member_Controller
. Instead of having to do the checks in all of them.