【问题标题】:Codeigniter view executed twice when calling a function from constructor从构造函数调用函数时,Codeigniter 视图执行了两次
【发布时间】:2016-10-02 08:52:52
【问题描述】:

我遵循了有关如何在 codeigniter 中为 php 应用程序设置登录系统的教程。用户拥有会话数据时的逻辑运行良好,但是当用户未登录时我遇到了问题(例如,一段时间后刷新页面)。当我从构造函数调用函数时,“not_logged_in”的视图被执行了两次。 以下代码有效,但这意味着我必须为之后添加的每个函数添加代码。

class App extends CI_Controller {

 function __construct()
 {
      parent::__construct();



 }
 private function logged_in()
 {

      $is_logged_in = $this->session->userdata('is_logged_in');
      if (isset($is_logged_in) OR $is_logged_in)
      {
           return TRUE;
      }
      else
      {
           $data['title'] = 'Chyba přihlášení';
           $data['main_content'] = 'not_logged_in';
           $this->load->view('includes/template', $data);
           return FALSE;
      }
 }

 function index()
 {
      if($this->logged_in())
      {
           $data['title'] = 'APLIKACE';
           $data['main_content'] = 'app_view';
           $data['userid'] = $this->session->userdata('userid'); //get userid from session
           $this->session->unset_userdata('userid'); //destroy the data
           $this->load->view('includes/template' , $data);
      }
 }


 function logout()
 {
     $this->session->sess_destroy();
     redirect('login');
 }


}

现在真正的问题是,我如何将整个逻辑放入构造函数中,而不必在每个函数中检查它?

【问题讨论】:

    标签: php constructor codeigniter-3


    【解决方案1】:

    制作APPPATH.'core/MY_Controller.php' 文件并将身份验证逻辑放入那里的构造函数中。比从每个控制器扩展该类(您需要身份验证逻辑)。

    class MY_Controller extends CI_Controller
    {
        public function __construct();
        {
            parent::__construct();
            $this->check_login();
        }
    
        protected function check_login()
        {
            $is_logged_in = $this->session->userdata('is_logged_in');
    
            //here should be *AND* instead *OR* logic
            if (isset($is_logged_in) && !empty($is_logged_in))
            {
                return TRUE;
            }
            else
            {
                redirect('login/index');
                exit();
            }
        }
    }
    

    Login.php 控制器:

    class Login extends CI_Controller//NOT extending MY_Controller to avoid infinite loop
    {
        public function __construct();
        {
            parent::__construct();
        }
    
        public function index()
        {
            //here is login view
            //and logic of preserving session
            //with redirect to 'app/index' after successful login
        }
    
        public function logout()
        {
            $this->session->sess_destroy();
            redirect('login');
        }
    }
    

    App.php 控制器:

    class App extends MY_Controller//extending MY_Controller to check login status
    {
        public function __construct();
        {
            parent::__construct();
        }
    
        public function index()
        {
            //here is app dashboard view
        }
    
        public function statistics()
        {
            //here is some other method that requires logged in user
        }
    }
    

    我也建议你检查Ion_auth认证系统,看看是否适合你。

    【讨论】:

    • 非常感谢这完美地解决了这个问题,我的代码在这个解决方案中看起来很整洁。顺便说一句,使用这样的自定义控制器时会出现问题吗?编辑:我将查看您链接的身份验证系统,看看是否可以将其合并到未来的项目中
    • 不客气。只是我不知道自定义控制器出错是什么意思。如果这是问题,使用核心类是最常见的事情。
    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多