作为CodeIgniter开发人员,了解如何使用核心会话库对您而言非常重要。 当然,您始终可以使用默认的$_SESSION
语法,但是始终建议使用包装器。
从如何加载会话库开始,我们将继续讨论如何添加,检索,删除和销毁会话变量。 在最后一部分中,我们将介绍CodeIgniter框架本身提供的各种内置会话驱动程序供您使用。
如何加载会话库
如果要在CodeIgniter中使用会话,则首先需要一个内置的会话库。 除非并且直到您开发一个根本不需要会话的Web应用程序,否则您不应该为会话库而烦恼。 尽管大多数情况并非如此,但是您可以在CodeIgniter中自动加载会话库,以便它为每个Web请求启用会话处理功能。
继续并打开位于application/config/autoload.php
的文件。 查找以下部分。
/*
| -------------------------------------------------------------------
| Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in system/libraries/ or your
| application/libraries/ directory, with the addition of the
| 'database' library, which is somewhat of a special case.
|
| Prototype:
|
| $autoload['libraries'] = array('database', 'email', 'session');
|
| You can also supply an alternative library name to be assigned
| in the controller:
|
| $autoload['libraries'] = array('user_agent' => 'ua');
*/
$autoload['libraries'] = array();
$autoload['libraries']
数组包含需要自动加载的库列表。 根据我们的要求,让我们将其更改为如下所示:
$autoload['libraries'] = array('session');
此外,还有另一种方法可以实现这一目标。 您可以在控制器文件中的某处使用以下代码来加载会话库。
$this->load->library('session');
就会话库的初始化而言,仅此而已。
在接下来的两节中,我们将介绍您可以对核心会话库执行的不同操作。 为了演示它,我们将构建一个示例控制器文件,该文件加载会话库并提供将在本文中讨论的方法。
继续并使用以下内容创建文件application/controllers/Example.php
。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Example extends CI_Controller {
public function __construct()
{
parent::__construct();
// load Session Library
$this->load->library('session');
// load url helper
$this->load->helper('url');
}
public function index()
{
/**** SET SESSION DATA ****/
// set single item in session
$this->session->set_userdata('favourite_website', 'https://tutsplus.com');
// set array of items in session
$arraydata = array(
'author_name' => 'Sajal Soni',
'website' => 'http://code.tutsplus.com',
'twitter_id' => '@sajalsoni',
'interests' => array('tennis', 'travelling')
);
$this->session->set_userdata($arraydata);
/**** GET SESSION DATA ****/
// get data from session
echo "Favourite Website: ". $this->session->userdata('favourite_website');
echo "<br>";
echo "Author Name: ". $this->session->userdata('author_name');
echo "<br>";
echo "Interest (Array Example): " . $this->session->userdata('interests')[0];
echo "<br>";
// get e'thing stored in session at once
echo '<pre>';
print_r($this->session->userdata());
/**** REMOVE SESSION DATA ****/
// unset specific key from session
$this->session->unset_userdata('favourite_website');
// unset multiple items at once
$keys = array('twitter_id', 'interests');
$this->session->unset_userdata($keys);
echo '<pre>';
print_r($this->session->userdata());
}
public function setflash()
{
// set flash data
$this->session->set_flashdata('flash_welcome', 'Hey, welcome to the site!');
// mark existing data as flash data
$this->session->set_userdata('flash_message', 'I am flash message!');
$this->session->mark_as_flash('flash_message');
redirect('example/getflash');
}
public function getflash()
{
// get flash data
echo "Flash welcome message: ". $this->session->flashdata('flash_welcome');
echo '<pre>';
print_r($this->session->flashdata());
}
public function tempdata()
{
// set temp data
$this->session->set_tempdata('coupon_code', 'XYEceQ!', 300);
// mark existing data as temp data
$this->session->set_userdata('coupon_code', 'XYEceQ!');
$this->session->mark_as_temp('coupon_code', 300);
// get temp data
echo $this->session->tempdata('coupon_code');
}
public function destroy()
{
$this->session->set_userdata('favourite_website', 'http://tutsplus.com');
// destory session
$this->session->sess_destroy();
}
}
作为CodeIgniter开发人员,这是一个非常基本的控制器文件。 现在,我们准备移至接下来的两节,以深入了解会话处理概念。
如何添加,检索和删除会话数据
首先,让我们获取__construct
方法的代码。
public function __construct()
{
parent::__construct();
// load Session Library
$this->load->library('session');
// load url helper
$this->load->helper('url');
}
以防万一您没有自动加载会话库,它将首先进行。 除此之外,我们还加载了url
帮助器,使我们可以使用某些实用工具方法,我们将在以后看到。
接下来,获取index
方法的代码。
public function index()
{
/**** SET SESSION DATA ****/
// set single item in session
$this->session->set_userdata('favourite_website', 'http://tutsplus.com');
// set array of items in session
$arraydata = array(
'author_name' => 'Sajal Soni',
'website' => 'http://code.tutsplus.com',
'twitter_id' => '@sajalsoni',
'interests' => array('tennis', 'travelling')
);
$this->session->set_userdata($arraydata);
/**** GET SESSION DATA ****/
// get data from session
echo "Favourite Website: ". $this->session->userdata('favourite_website');
echo "<br>";
echo "Author Name: ". $this->session->userdata('author_name');
echo "<br>";
echo "Interest (Array Example): " . $this->session->userdata('interests')[0];
echo "<br>";
// get e'thing stored in session at once
echo '<pre>';
print_r($this->session->userdata());
/**** REMOVE SESSION DATA ****/
// unset specific key from session
$this->session->unset_userdata('favourite_website');
// unset multiple items at once
$keys = array('twitter_id', 'interests');
$this->session->unset_userdata($keys);
echo '<pre>';
print_r($this->session->userdata());
}
既然已经加载了会话库,就可以使用$this->session
来访问会话对象并访问所支持的方法。 set_userdata
方法用于创建新的会话变量,并且通常使用两个参数-key和value。
$this->session->set_userdata('favourite_website', 'http://tutsplus.com');
您也可以使用set_userdata
方法在单个调用中创建多个变量。 在这种情况下,您只需要提供一个参数,它就应该是一个数组,如下所示。
// set array of items in session
$arraydata = array(
'author_name' => 'Sajal Soni',
'website' => 'http://code.tutsplus.com',
'twitter_id' => '@sajalsoni',
'interests' => array('tennis', 'travelling')
);
$this->session->set_userdata($arraydata);
眼神敏锐的用户会注意到,您还可以将数组分配为任何会话变量的值,如上面的interests
示例所示。
现在,让我们看看如何检索任何会话变量的值。 userdata
方法用于检索任何会话变量的值,通常它需要将要查找的会话变量的键作为第一个参数。
echo "Favourite Website: ". $this->session->userdata('favourite_website');
如果要查找数组条目之一,则可以使用以下命令:
echo "Interest (Array Example): " . $this->session->userdata('interests')[0];
通常,您想知道活动会话中总共存储了多少变量以进行调试,您也可以这样做。
// get e'thing stored in session at once
echo '<pre>';
print_r($this->session->userdata());
是的,我们可以使用相同的userdata
方法! 如果您没有将任何参数传递给userdata
方法,它将返回所有会话变量。
最后,让我们看看如何从会话中删除变量。 如果要删除任何会话条目,可以使用unset_userdata
方法。
// unset specific key from session
$this->session->unset_userdata('favourite_website');
这是相同方法的变体,它显示了如何一次性删除多个条目。
// unset multiple items at once
$keys = array('twitter_id', 'interests');
$this->session->unset_userdata($keys);
这应该从会话中删除twitter_id
和interests
条目。
继续并测试index
方法以查看实际情况。
有用的东西:Flashdata和Tempdata
在上一节中,我们讨论了CodeIgniter中会话处理的基础。 在本节中,我们将讨论会话库提供的其他几个实用程序方法。
在日常开发中,您经常需要显示消息以响应某些用户操作。 例如,当某人在您的网站上发表评论时,您希望显示一条成功消息,并且该消息应仅显示一次。 set_flashdata
方法是此类用例的理想选择。
实际上, set_flashdata
与set_userdata
方法非常相似,因为它允许您在会话中保存值。 唯一的例外是,由flashdata
方法设置的会话值仅可用于下一个请求。 在随后的请求中,您将无法再访问这些已清除的变量。
抓住setflash
方法的代码。
public function setflash()
{
// set flash data
$this->session->set_flashdata('flash_welcome', 'Hey, welcome to the site!');
// mark existing data as flash data
$this->session->set_userdata('flash_message', 'I am flash message!');
$this->session->mark_as_flash('flash_message');
redirect('example/getflash');
}
您可以使用与使用set_userdata
方法创建常规会话变量相同的方式来创建新的flashdata
变量。 另一方面,您也可以将现有的会话变量标记为flashdata
变量。 在这种情况下,您需要使用mark_as_flash
方法,如上面的代码所示。
最后,我们将用户重定向到getflash
方法,该方法显示了如何使用在setflash
方法中设置的flashdata变量。 让我们快速看一下getflash
方法。
public function getflash()
{
// get flash data
echo "Flash welcome message: ". $this->session->flashdata('flash_welcome');
echo '<pre>';
print_r($this->session->flashdata());
}
与预期的一样,有一个flashdata
方法,允许您获取存储为flashdata的会话变量。 如果不带任何参数调用flashdata
方法,它将返回所有与userdata
方法相似的flashdata变量。
继续并测试setflash
方法。 您将被重定向到getflash URL,并且您会看到消息。 如果刷新getflash页面,将不再看到该消息!
接下来,会话库在此类别中提供了另一个变体-tempdata会话变量。 如果要在特定时间段内创建会话变量,则可以使用set_tempdata
方法。
例如,如果要创建一个会话变量,该变量在一定时间段后应自动删除,则可以使用set_tempdata
方法创建这样的变量,如以下方法所示。
public function tempdata()
{
// set temp data
$this->session->set_tempdata('coupon_code', 'XYEceQ!', 300);
// mark existing data as temp data
$this->session->set_userdata('coupon_code', 'XYEceQ!');
$this->session->mark_as_temp('coupon_code', 300);
// get temp data
echo $this->session->tempdata('coupon_code');
}
set_tempdata
方法中的第三个参数指示将从会话中删除变量的秒数。
您还可以使用mark_as_temp
方法将现有会话变量标记为mark_as_temp
前提是您已经使用set_userdata
方法创建了会话变量。
最后,您可以使用tempdata
方法来获取任何tempdata变量的值。
因此,在您的日常开发生命周期中拥有这样的实用程序方法是很好的选择!
您不应该忘记的事情:会话破坏
当用户注销时,销毁会话可能是您要做的最后一件事。 这样可以确保将到目前为止设置的会话变量从活动会话中删除,并且不再可用于后续请求。
让我们拉入destroy
方法的代码并进行遍历。
public function destroy()
{
$this->session->set_userdata('favourite_website', 'http://tutsplus.com');
// destroy session
$this->session->sess_destroy();
}
正是sess_destroy
方法帮助我们破坏了活动会话。 当然,它还将删除在活动会话中设置的tempdata和flashdata变量。
一旦会话在当前用户上下文中不再有用,请确保您习惯于破坏会话。
顶部的樱桃:会话驱动程序
我们将讨论本文的最后一部分-会话驱动程序。 通常,您不必担心在应用程序中配置会话驱动程序,因为默认会话驱动程序(文件系统)已经使用默认设置进行了配置。
因此,它是保存所有与会话有关的数据的文件系统,它得到了广泛使用,并且是会话处理的公认标准。 话虽如此,CodeIgniter还支持其他会话驱动程序,如果您希望从默认文件系统会话驱动程序切换,可以使用这些会话驱动程序。
以下是CodeIgniter中所有受支持的会话驱动程序的列表:
- 档案
- 数据库
- 雷迪斯
- 记忆快取
顾名思义,数据库会话驱动程序将会话数据存储在为CodeIgniter应用程序配置的数据库中。
另一方面,其他两个会话驱动程序是高性能网站首选的内存中存储机制。
在application/config/config.php
文件中,您可以配置要在应用程序中使用的会话驱动程序。
$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'custom_sessions';
它告诉CodeIgniter使用数据库会话驱动程序,会话数据将保存在MySQL的custom_sessions
表中。
关于每个会话驱动程序的讨论不在本文讨论范围之内,但是您可以阅读官方站点文档,该文档为每个驱动程序提供了深入的指南。
结论
今天的教程主题是CodeIgniter中的会话处理,并且我们通过研究本主题的各个方面对其进行了全面讨论。
从基本的会话操作开始,我们还介绍了一些很酷的flashdata和tempdata方法,而对会话驱动程序的讨论是本文的结尾。
与往常一样,您可以使用下面的提要大声疾呼您的疑问和建议!
翻译自: https://code.tutsplus.com/tutorials/how-to-work-with-session-data-in-codeigniter--cms-28658