如何通过示例在 CodeIgniter 中设置 Session
CodeIgniter 会话管理
如果您之前开发过桌面应用程序,那么您可能知道可以定义一个全局变量,为其赋值,并在应用程序的整个生命周期中使用它,打开和关闭多个(1)实例,并且每个请求都可以访问该全局变量。
换句话说,应用程序的状态被维护了。也就是说,如果您在登录时将公司名称设置为一个全局变量,那么即使在关闭登录表单后,该公司名称的状态也会被保留。
HTTP 的工作方式与我们刚刚描述的场景略有不同。它是无状态的。也就是说,您在一个请求中所做的事情在下一个请求中不会保留。T
为了解决这个问题。我们在 PHP 中有两种解决方案。我们可以使用 cookie,它是放在用户计算机上的小文件,或者使用会话,它们与 cookie 类似,但存储在服务器上,并且比 cookie 容量更大。
何时使用会话?
当您想了解用户在页面之间的活动时,会话通常很有用。例如,假设您的网站有一个受保护的区域。用户不必在每个页面上都登录。您可以让用户登录一次,然后将其详细信息存储在会话变量中,然后在后续请求中重用相同的数据。其他用例包括在处理购物系统时,用户需要将商品添加到购物车。
或者,CodeIgniter 也使用会话来仅在下一个请求中提供数据。当您可能已编辑和更新了数据库记录,并且希望在将用户重定向到另一页时向用户返回一些反馈时,这很有用。
将 Flash 消息发送到其他页面,使用 CI 会话
在本节中,您将通过 CodeIgniter 中的会话库学习如何将 Flash 消息发送到其他页面,CodeIgniter
创建一个名为 SessionController 的新文件,位于
application/controllers/SessionController.php
添加以下代码:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class SessionController extends CI_Controller { public function __construct() { parent:: __construct(); $this->load->helper('url'); $this->load->library('session'); } public function index() { $this->load->view('sessions/index'); } public function flash_message(){ $this->session->set_flashdata('msg', 'Welcome to CodeIgniter Flash Messages'); redirect(base_url('flash_index')); } }
此处,
- class SessionController extends CI_Controller {…} 定义 SessionController 类并扩展父控制器类。
- public function __construct() {…} 定义构造函数方法,该方法初始化父类,并加载 url 助手和会话库。
- public function index() {…} 定义会话索引方法,该方法加载会话索引视图。
- public function flash_message(){…} 定义 flash 消息方法,该方法设置 flash 数据,然后重定向到 flash_index 路由
现在让我们创建将显示会话数据值的视图。
在 application/views 中创建一个名为 session 的新目录
在 application/views/sessions 中创建一个名为 index.php 的新文件
添加以下代码:
<html> <head> <title>Code Igniter Flash Session</title> </head> <body> <p>The session value of msg is <b> <?=$this->session->userdata('msg');?> </b></p> </body> </html>
此处,
<?=$this->session->userdata(‘msg’);?> 检索键为 msg 的会话数据的值,并在浏览器中显示它。
现在让我们为我们的会话 Flash 方法创建路由
打开 application/config/routes.php
添加以下行
$route['flash_index'] = 'session controller'; $route['flash_message'] = 'session controller/flash_message';
现在让我们启动 PHP 的内置服务器,PHP 并测试我们的 Flash 消息
打开终端
运行以下命令
cd C:\Sites\ci-app php -S localhost:3000
此处,
上面的命令将浏览到应用程序代码目录并在端口 3000 上启动内置服务器。
注意:应用程序路径必须与您下载 CodeIgniter 的路径匹配,并且您可以使用计算机上任何可用的端口号。不必使用端口 3000。
在 Web 浏览器中加载以下 URL:https://:3000/flash_message
您将被重定向到以下 URL,并且会得到以下结果:https://:3000/flash_index
点击 Web 浏览器的刷新按钮或按 F5
您现在将获得以下结果
将用户数据存储在 CI 会话中
现在让我们看一个稍微高级一点的例子。为了简单起见,我们将模拟用户认证,而不进行实际的数据库记录和提交的密码的验证实现。
让我们从路由开始
打开位于 application/config 中的 routes.php
添加以下路由
$route['login'] = 'sessioncontroller/login'; $route['authenticate'] = 'sessioncontroller/authenticate'; $route['settings'] = 'sessioncontroller/settings'; $route['dashboard'] = 'sessioncontroller/dashboard'; $route['logout'] = 'sessioncontroller/logout';
此处,
- $route[‘login’] = ‘sessioncontroller/login’; 定义显示登录表单的路由
- $route[‘authenticate’] = ‘sessioncontroller/authenticate’; 定义模拟用户成功登录并设置会话登录数据的路由。
- $route[‘settings’] = ‘sessioncontroller/settings’; 定义一个受保护的页面,该页面只能由登录用户访问
- $route[‘dashboard’] = ‘sessioncontroller/dashboard’; 定义一个受保护的页面,该页面只能由登录用户访问。
- $route[‘logout’] = ‘sessioncontroller/logout’; 通过销毁会话数据来注销用户。该方法还会重定向到登录页面
现在让我们更新 SessionController
打开 application/controllers/SessionController.php
添加以下方法
public function check_auth($page) { if (!$this->session->userdata('logged_in')) { $this->session->set_flashdata('msg', "You need to be logged in to access the $page page."); redirect('login'); } } public function login() { $this->load->view('sessions/login'); } public function authenticate() { $this->session->set_userdata('username', 'John Doe'); $this->session->set_userdata('logged_in', TRUE); redirect(base_url('dashboard')); } public function dashboard() { $this->check_auth('dashboard'); $this->load->view('sessions/dashboard'); } public function settings() { $this->check_auth('settings'); $this->load->view('sessions/settings'); } public function logout() { $this->session->unset_userdata('username'); $this->session->unset_userdata('logged_in'); redirect(base_url('login')); }
此处,
- public function check_auth($page) {…} 定义检查用户是否登录然后允许访问该页面的方法。如果用户未登录,则用户将被重定向到带有 Flash 消息的登录页面。
- public function login() {…} 加载位于 sessions 目录下的登录视图。
- public function authenticate() {…} 为 logged_in 和 username 键设置会话用户数据。注意:我们不验证任何登录详细信息与数据库。我们只是假设提交的详细信息是正确的,并设置会话数据。
- public function dashboard() {…} 在调用 $this->check_auth(‘dashboard’); 后加载仪表板页面,该页面验证 logged_in 会话键是否已设置。
- public function settings() {…} 加载也受保护的设置页面
- public function logout() {…} 销毁会话数据并注销用户。该方法还将重定向到登录页面
CodeIgniter 会话视图
在 application/views/sessions 中创建以下视图
- dashboard.php
- login.php
- settings.php
将以下代码添加到 dashboard.php
<!DOCTYPE html> <html> <head> <title>Dashboard</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"> </head> <body> <div class="container"> <div class="column"> <nav class="navbar" role="navigation" aria-label="main navigation"> <div id="navbarBasicExample" class="navbar-menu"> <div class="navbar-start"> <a href="<?= site_url('dashboard')?>" class="navbar-item is-active">Dashboard</a> <a href="<?= site_url('settings')?>" class="navbar-item">Settings</a> </div> <div class="navbar-end"> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link"><?=$this->session->userdata('username');?></a> <div class="navbar-dropdown"> <a class="navbar-item">My Profile</a> <hr class="navbar-divider"> <a class="navbar-item">Sign out</a> </div> </div> </div> </div> </nav> <h3>Welcome Page</h3> </div> </div> </body> </html>
此处,
<?=$this->session->userdata(‘username’);?> 显示我们在认证方法中设置的用户名
将以下代码添加到 login.php
<!DOCTYPE html> <html> <head> <title>Login</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"> </head> <body> <div class="container"> <div class="column"> <p><?=$this->session->userdata('msg');?></p> <form method="post" action="<?= site_url('authenticate')?>"> <div class="field"> <label class="label">Username</label> <div class="control"> <input class="input" type="text" placeholder="Text input"> </div> </div> <div class="field"> <label class="label">Password</label> <div class="control"> <input class="input" type="passport" placeholder="Text input"> </div> </div> <div class="field is-grouped"> <div class="control"> <button class="button is-success">Login</button> </div> </div> </form> </div> </div> </body> </html>
此处,
登录表单提交到 authenticate 路由。
将以下代码添加到 settings.php
<!DOCTYPE html> <html> <head> <title>Settings</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"> </head> <body> <div class="container"> <div class="column"> <nav class="navbar" role="navigation" aria-label="main navigation"> <div id="navbarBasicExample" class="navbar-menu"> <div class="navbar-start"> <a href="<?= site_url('dashboard')?>" class="navbar-item">Dashboard</a> <a href="<?= site_url('settings')?>" class="navbar-item">Settings</a> </div> <div class="navbar-end"> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link">Jim Jones</a> <div class="navbar-dropdown"> <a href="#" class="navbar-item">My Profile</a> <hr class="navbar-divider"> <a href="<?= site_url('logout')?>" class="navbar-item">Sign out</a> </div> </div> </div> </div> </nav> <h3>Settings Page</h3> </div> </div> </body> </html>
我们的视图到此为止。现在让我们测试我们的应用程序。
在本教程中,我们使用了内置的 PHP Web 服务器,但您可以使用任何支持 PHP 的 Web 服务器。
打开终端
运行以下命令
cd C:\Sites\ci-app php -S localhost:3000
此处,
上面的命令将浏览到应用程序代码目录并在端口 3000 上启动内置服务器。
注意:应用程序路径必须与您下载 CodeIgniter 的路径匹配,并且您可以使用计算机上任何可用的端口号。不必使用端口 3000。
在您的 Web 浏览器中打开以下 URL:https://:3000/dashboard
您将被重定向到以下页面
点击登录按钮
您将看到以下结果
登录后,我们现在可以看到会话数据。
摘要
在本教程中,您学习了 CodeIgniter 会话库的基础知识,并学会了如何使用它来存储临时数据作为 Flash 消息,以及如何存储更永久的数据,即用户登录数据。