Let say at my controller named Book, I have many methods, such as
get_book();
read_book();
remove_book();
No methods in the class can be used without user logged in, and I can get the user_id
from session.
My question is, what is/are the best ways to check the if the user_id
session is set so that I can use the methods?
As for now I am thinking of creating a is_logged_in()
method, and apply it to every methods with an if-else statement, like
if($this->is_logged_in()
{
//do something
}
else
{
//redirect to home
}
Isn’t it long and tedious? Is there an ultimate way to achieve this?
I read the link
codeigniter check for user session in every controller
But it seems that I still have to apply the is_logged_in
check at every methods.
Thank you for helping me!
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.
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');
}