我通过本指南构建了一个用户登录我的网站:http://www.iluv2code.com/login-with-codeigniter-php.html
我对会话几乎没有疑问
我需要将 session_start(); 放入每个控制器中,或者代码点火器中有一种方法可以自动出现在所有控制器中?(我应该这样做吗?
还有另一种方法可以放入每个函数:
if($this->session->userdata('logged_in'))
{
//function code
}else{
//If no session, redirect to login page
redirect('../login', 'refresh');
}
或者我应该为每个控制器函数执行此操作(例如,如果我有名为 page 的控制器并且他有函数:index,edit,view,我需要为每个函数放置它?
最后一个问题,我在视图/标题调用的每个页面的顶部都有注销按钮我是否也应该放置这个函数:
function logout()
{
$this->session->unset_userdata('logged_in');
session_destroy();
redirect('home', 'refresh');
}
在每个控制器中,或者我可以以某种方式执行"golbel"功能?
编辑:我在钩子中使用它.php:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files. Please see the user guide for info:
|
| http://codeigniter.com/user_guide/general/hooks.html
|
*/
$hook['post_controller_constructor'] = array(
'class' => 'SessionData',
'function' => 'initializeData',
'filename' => 'loginHelper.php',
'filepath' => 'hooks',
'params' => array()
);
and this in loginHelper.php:
<?
class SessionData {
var $CI;
function __construct(){
$this->CI =& get_instance();
if(!isset($this->CI->session)) //Check if session lib is loaded or not
$this->CI->load->library('session'); //If not loaded, then load it here
}
function initializeData() {
// This function will run after the constructor for the controller is ran
// Set any initial values here
if(!$this->CI->session->userdata('logged_in')){ //call session methods with super object
redirect('../login', 'refresh');
}else{
$data['user'] = $this->CI->session->userdata('logged_in');
}
}
}
?>
/* End of file hooks.php */
/* Location: ./application/config/hooks.php */
用户["数据"]未在所有页面中创建。 我错在哪里?
对于您关于注销的第二个问题,我通常将logout
函数放在User
控制器中,并将其称为<a href="<?php echo base_url().'user/logout';?>">Log Out</a>
。
对于您的第一个问题,我看到了一个教程,如何在控制器中进行用户登录并在常规控制器中扩展该控制器,这就是您避免在每个函数中进行登录检查的方法。我正在尝试找到该教程,一旦我得到它,我就会分享它,但概念就是这样。
把session_start();
放在每个控制器中!
您只需在config
目录中的autoload.php
文件中启动会话类即可!
$autoload['libraries'] = array('database', 'session', 'encrypt');
另外,最好在类的构造函数中检查用户是否已登录!
if(!$this->session->userdata('logged_in'))
redirect('loginController/loginFunction', 'refresh');
要在注销时销毁所有会话,您可以使用sess_destroy();
初始化会话
要自动加载 Session,请打开 application/config/autoload.php
文件并将要加载的项目添加到 autoload
数组中,以便: $autoload['libraries'] = array('session');
Yo 根本不使用session_start();
和session_destroy();
。
- 会话文档:https://ellislab.com/codeigniter/user-guide/libraries/sessions.html
- 自动加载资源:https://ellislab.com/codeigniter/user-guide/general/autoloader.html
检查登录
使用 Hooks 来避免笨重的代码重复,这是更好的做法。导航页面底部并阅读挂钩点,以便您有一个想法。这很容易!一定要学习钩子。
注销
你的回答在这里解释。
经过大量工作,我解决了登录检查的问题。
我没有使用钩子。我在核心文件夹中构建了一个MY_Controller,并在我期望从登录控制器获得的所有控制器中扩展它。
在MY_Controller我使用登录检查。
CodeIgniter 核心控制器:https://philsturgeon.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY/