如何通过示例在 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

Sending Flash Messages to other pages

点击 Web 浏览器的刷新按钮或按 F5

您现在将获得以下结果

Sending Flash Messages to other pages

将用户数据存储在 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 Session Views

点击登录按钮

您将看到以下结果

CodeIgniter Session Views

登录后,我们现在可以看到会话数据。

摘要

在本教程中,您学习了 CodeIgniter 会话库的基础知识,并学会了如何使用它来存储临时数据作为 Flash 消息,以及如何存储更永久的数据,即用户登录数据。