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)

上述函式只接受鍵作為引數。

示例

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

刪除會話資料

要從會話中刪除資料,我們可以使用delete()會話方法刪除資料。

Session::delete($key)

上述函式只接受要從會話中刪除的值的鍵。

示例

$session->delete('name');

如果要讀取然後從會話中刪除資料,可以使用consume()會話方法。

static Session::consume($key)

上述函式只接受鍵作為引數。

示例

$session->consume('name');

銷燬會話

當用戶從站點登出時,我們需要銷燬使用者會話,要銷燬會話,可以使用destroy()方法。

Session::destroy()

示例

$session->destroy();

銷燬會話將從伺服器中刪除所有會話資料,但不會刪除會話cookie。

更新會話

在需要更新使用者會話的情況下,可以使用renew()會話方法。

Session::renew()

示例

$session->renew();

完整會話示例

按照以下程式所示更改config/routes.php檔案。

config/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/Template/Sessions/write_session_data.php

The data has been written in session.

在相同的Sessions目錄下建立另一個名為retrieve_session_data.php的檢視檔案,並將以下程式碼複製到該檔案中。

src/Template/Sessions/retrieve_session_data.php

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

在相同的Sessions目錄下建立另一個名為check_session_data.ctp的檢視檔案,並將以下程式碼複製到該檔案中。

src/Template/Sessions/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/Template/Sessions/delete_session_data.ctp

Data deleted from session.

在相同的Sessions目錄下建立另一個名為destroy_session_data.ctp的檢視檔案,並將以下程式碼複製到該檔案中。

src/Template/Sessions/destroy_session_data.ctp

Session Destroyed.

輸出

訪問以下URL執行上述示例。此URL將幫助您寫入會話資料。

https:///cakephp4/session-write

Written in Session

訪問以下URL讀取會話資料 − https:///cakephp4/session-read

Name

訪問以下URL檢查會話資料 − https:///cakephp4/session-check

Name Exists

訪問以下URL刪除會話資料 − https:///cakephp4/session-delete 訪問

Delete From Session

訪問以下URL銷燬會話資料 − https:///cakephp4/session-destroy

Destroyed
廣告
© . All rights reserved.