CodeIgniter - Как проверить сессию для использования в каждом методе - PullRequest
7 голосов
/ 24 ноября 2011

Допустим, на моем контроллере с именем Книга у меня есть много методов, таких как get_book(); read_book(); remove_book();

Никакие методы в классе не могут быть использованы без входа пользователя, и я могу получить user_id из сеанса.

У меня вопрос, , как лучше всего проверить, установлен ли сеанс user_id, чтобы я мог использовать методы?

На данный момент я думаю о создании метода is_logged_in() и применении его ко всем методам с помощью оператора if-else, например

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

Разве это не долго и не утомительно? Есть ли окончательный способ достичь этого?

читаю ссылку

проверка кодов на сеанс пользователя в каждом контроллере

Но, похоже, мне все еще приходится применять проверку is_logged_in при каждом методе.

Спасибо за помощь!

Ответы [ 3 ]

11 голосов
/ 24 ноября 2011

Создайте файл с именем MY_controller.php (префикс можно изменить в файле конфигурации) в /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
    }

}

Затем каждый раз, когда вы создаете новый контроллер, вы решаете, для какого доступа ему требуется

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

Это значительно сокращает дублирование кода, поскольку, если вам нужен другой контроллер участника, отличный от Book, вы можете просто расширить Member_Controller. Вместо того, чтобы делать проверки во всех из них.

9 голосов
/ 24 ноября 2011

Вам не обязательно делать это.Просто введите код проверки входа в конструктор, и все готово!

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 голосов
/ 24 ноября 2011

Вы можете использовать метод в конструкторе контроллера, например:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...