CakePHP - 会话管理


会话允许我们跨请求管理唯一用户,并存储特定用户的数据。会话数据可以在任何地方访问,只要您可以访问请求对象,即可从控制器、视图、助手、单元和组件访问会话。

访问会话对象

可以通过执行以下代码来创建会话对象。

$session = $this->request->session();

写入会话数据

要在会话中写入内容,我们可以使用write() 会话方法。

Session::write($key, $value)

上面的方法将采用两个参数,即和将存储该值的键。

例子

$session->write('name', 'Virat Gandhi');

读取会话数据

要从会话中检索存储的数据,我们可以使用read() 会话方法。

Session::read($key)

上述函数仅采用一个参数,即值的键,该值在写入会话数据时使用。一旦提供了正确的密钥,该函数将返回其值。

例子

$session->read('name');

当您想检查会话中是否存在特定数据时,可以使用check() 会话方法。

Session::check($key)

上面的函数只接受 key 作为参数。

例子

if ($session->check('name')) {
   // name exists and is not null.
}

删除会话数据

要从会话中删除数据,我们可以使用delete()会话方法来删除数据。

Session::delete($key)

上述函数将仅获取要从会话中删除的值的键。

例子

$session->delete('name');

当您想从会话中读取数据然后删除数据时,我们可以使用Consumer() 会话方法。

static Session::consume($key)

上面的函数只接受 key 作为参数。

例子

$session->consume('name');

销毁会话

我们需要销毁用户会话,当用户从站点注销并销毁会话时,将使用destroy()方法。

Session::destroy()

例子

$session->destroy();

销毁会话将从服务器中删除所有会话数据,但不会删除会话 cookie。

续订会话

在您想要续订用户会话的情况下,我们可以使用renew() session方法。

Session::renew()

例子

$session->renew();

完整的会话

在config/routes.php文件中进行更改,如以下程序所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   //$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
   $builder->connect('/session-object',['controller'=>'Sessions','action'=>'index']);
   $builder->connect('/session-read',['controller'=>'Sessions','action'=>'retrieve_session_data']);
   $builder->connect('/session-write',['controller'=>'Sessions','action'=> 'write_session_data']);
   $builder->connect('/session-check',['controller'=>'Sessions','action'=>'check_session_data']);
   $builder->connect('/session-delete',['controller'=>'Sessions','action'=>'delete_session_data']);
   $builder->connect('/session-destroy',['controller'=>'Sessions','action'=>'destroy_session_data']);
   $builder->fallbacks();
});

在src/Controller/SessionsController.php创建SessionsController.php文件将以下代码复制到控制器文件中

src/Controller/SessionsController.php

<?php
namespace App\Controller;
use App\Controller\AppController;
   class SessionsController extends AppController {
   public function retrieveSessionData() {
      //create session object
      $session = $this->request->getSession();
      //read data from session
      $name = $session->read('name');
      $this->set('name',$name);
   }
   public function writeSessionData(){
      //create session object
      $session = $this->request->getSession();
      //write data in session
      $session->write('name','Virat Gandhi');
   }
   public function checkSessionData(){
      //create session object
      $session = $this->request->getSession();
      //check session data
      $name = $session->check('name');
      $address = $session->check('address');
      $this->set('name',$name);
      $this->set('address',$address);
   }
   public function deleteSessionData(){
      //create session object
      $session = $this->request->getSession();
      //delete session data
      $session->delete('name');
   }
   public function destroySessionData(){
      //create session object
      $session = $this->request->getSession();
      //destroy session
      $session->destroy();
   }
}
?>

src/Template处创建一个Sessions目录,并在该目录下创建一个名为 write_session_data.php 的视图文件将以下代码复制到该文件中。

src/模板/会话/write_session_data.php

The data has been written in session.

在同一Sessions目录下创建另一个名为retrieve_session_data.php的视图文件,并将以下代码复制到该文件中。

src/模板/会话/retrieve_session_data.php

Here is the data from session.
Name: <?=$name;?>

在同一 Sessions 目录下创建另一个名为check_session_data.ctp的视图文件,并将以下代码复制到该文件中。

src/模板/会话/check_session_data.ctp

<?php if($name): ?>
name exists in the session.
<?php else: ?>
name doesn't exist in the database
<?php endif;?>
<?php if($address): ?>
address exists in the session.
<?php else: ?>
address doesn't exist in the database
<?php endif;?>

在同一 Sessions 目录下创建另一个名为delete_session_data.ctp的视图文件,并将以下代码复制到该文件中。

src/模板/会话/delete_session_data.ctp

Data deleted from session.

在同一 Sessions 目录下创建另一个名为destroy_session_data.ctp的视图文件,并将以下代码复制到该文件中。

src/模板/会话/destroy_session_data.ctp

Session Destroyed.

输出

通过访问以下 URL 来执行上述示例。该 URL 将帮助您在会话中写入数据。

http://localhost/cakephp4/session-write

写在会话中

访问以下 URL读取会话数据 - http://localhost/cakephp4/session-read

姓名

访问以下 URL以检查会话数据- http://localhost/cakephp4/session-check

名称已存在

访问以下 URL来删除会话数据- http://localhost/cakephp4/session-delete 访问

从会话中删除

访问以下 URL销毁会话数据- http://localhost/cakephp4/session-destroy

被毁