【CakePHP入門】seesionでユーザーのデータを格納する方法

こんにちは!フリーランスの長野です。

sessionって使ってますか?

セッション(session)とは、サーバー側に一時的にデータを保存する仕組みのことです。

例えば、WEBサイトのログイン情報や最終のアクセス情報など、ユーザー個人にひもづくようなデータをセッションに格納して使用することが多いです。

この記事では、sessionについて

・セッション(session)とは
・セッションデータの操作について

という基本的な内容から、

・セッションの設定について

など応用的な使い方の内容についても解説していきます。

今回はsessionについて、使い方をわかりやすく解説します!

目次

セッション(session)とは

セッションとは、前述のとおりサーバー側に一時的にデータを保存する仕組みのことです。

WEBサイトのログイン情報や最終のアクセス情報など、ユーザー個人にひもづくようなデータをセッションに格納して使用します。

データを保存する点でCookie(クッキー)と似ていますが、Cookieはブラウザ側にデータを保存するのに対して、セッションはサーバー側にデータを保存し、テータの保存場所が異なります。

ブラウザ側にデータを保存するCookieは、ユーザーによりデータが改ざんされる可能性があるため、セッションの方がよりセキュリティ的に安全だとされています。

セッションデータの操作について

それでは実際にセッションの使い方についてみていきましょう。

セッションを使用するには下記のようにセッションオブジェクトを取得する必要があります。

セッションオブジェクトの取得方法:

$this->request->session();

それでは、セッションデータの書き込みや読み込みなどの具体的な操作について確認していきましょう。

読み込み(read)と書き込み(write)について

セッションデータの読み込みにはreadを、書き込みにはwriteを使用します。

記述方法は下記のとおりです。

writeは複数のハッシュを指定して書き込むこともできます。

データの読み込み方法:

$this->request->session()->read($key);

データの書き込み方法:

$this->request->session()->write($key, $value);

複数のハッシュを指定して書き込む方法:

$this->request->session()->write([
    $key1 => $value1,
    $key2 => $value2,
    ・・・・・・
    ]);

それではサンプルコードで確認していきましょう。

「/src/Controller/PersonsController.php」にサンプルコードを記述し、「/src/Template/Persons/index.ctp」で出力表示の設定を記述しています。

/src/Controller/PersonsController.php:

<?php
namespace App\Controller;

use App\Controller\AppController;

class PersonsController extends AppController
{

    public function index()
    {
        // セッションオブジェクトの取得
        $session = $this->request->session();
        
        // セッションデータの書き込み
        $session->write('person1.name', 'Taro');
        $session->write('person1.mail', 'taro@gmail.com');
        
        // 連想配列で複数のハッシュを指定して書き込み
        $session->write([
            'person2.name' => 'Jiro',
            'person2.mail' => 'jiro@gmail.com'
            ]);
        
        // セッションデータの読み込み
        $this->set('name1', $session->read('person1.name'));
        $this->set('mail1', $session->read('person1.mail'));
        $this->set('name2', $session->read('person2.name'));
        $this->set('mail2', $session->read('person2.mail'));
    }
}

/src/Template/Persons/index.ctp:

<div>
    <h3>List Persons</h3>
    <table>
        <thead>
            <tr>
                <th>NAME</th>
                <th>MAIL</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><?=$name1 ?></td>
                <td><?=$mail1 ?></td>
            </tr>
            <tr>
                <td><?=$name2 ?></td>
                <td><?=$mail2 ?></td>
            </tr>
        </tbody>
    </table>
</div>

実行結果:
20170713ListPersons

存在の確認(check)や削除(delete、consume)、破棄(destroy)について

セッションデータが存在するか、nullでないか確認するにはcheckを使用します。

また、削除する場合にはdeleteを、読み込み後削除する場合にはconsumeを使用します。

セッションを破棄する場合にはdestroyを使用します。

それぞれの記述方法については下記のとおりです。

checkの記述方法:

$this->request->session()->check($key)

deleteの記述方法:

$this->request->session()->delete($key)

consumeの記述方法:

$this->request->session()->consumue($key)

destroyの記述方法:

$this->request->session()->destroy()

それではサンプルコードで確認していきましょう。

/src/Controller/PersonsController.php:

<?php
namespace App\Controller;

use App\Controller\AppController;

class PersonsController extends AppController
{

    public function index()
    {
        // セッションオブジェクトの取得
        $session = $this->request->session();
        
        // セッションデータの書き込み
        $session->write('person1.name', 'Taro');
        $session->write('person1.mail', 'taro@gmail.com');
        
        // 連想配列で複数のハッシュを指定して書き込み
        $session->write([
            'person2.name' => 'Jiro',
            'person2.mail' => 'jiro@gmail.com'
            ]);
        
        // セッションデータの読み込み
        $this->set('name1', $session->read('person1.name'));
        $this->set('mail1', $session->read('person1.mail'));
        $this->set('name2', $session->read('person2.name'));
        
        // 削除
        $session->delete('person2.name');
        // 読み込み後削除
        $this->set('mail2', $session->consume('person2.mail'));
        
        // データが存在するか、nullでないか確認
        if($session->check('person2.name')) {
            $this->set('name3', $session->read('person2.name'));
        } else {
            $this->set('name3', '削除されました');
        }
        if($session->check('person2.mail')) {
            $this->set('mail3', $session->read('person2.mail'));
        } else {
            $this->set('mail3', '削除されました');
        }
        
        // セッションの破棄
        $session->destroy();
    }
}

/src/Template/Persons/index.ctp:

<div>
    <h3>List Persons</h3>
    <table>
        <thead>
            <tr>
                <th>NAME</th>
                <th>MAIL</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><?=$name1 ?></td>
                <td><?=$mail1 ?></td>
            </tr>
            <tr>
                <td><?=$name2 ?></td>
                <td><?=$mail2 ?></td>
            </tr>
            <tr>
                <td><?=$name3 ?></td>
                <td><?=$mail3 ?></td>
            </tr>
        </tbody>
    </table>
</div>

実行結果:
20170713ListPersons2

セッションIDの切り替え(renew)について

ユーザーがログインやログアウトをした際、Authコンポーネントにより自動的にセッションIDは更新されます。

それ以外でセッションIDを手動で切り替えたい場合はrenewを使用します。

renewの記述方法:

$this->request->session()->renew()

セッションの設定について

セッションを破棄するまでの時間などを設定することができます

CakePHP3.xでは「config/app.php」に記述します。

連想配列のキーにcookiecookieTimeouttimeoutを指定してセッションの設定を行います。

default セッション設定の基礎として使用するデフォルト設定
timeout セッションを破棄するまでの時間を分単位で指定
cookie 使用するcookie名。デフォルトは「CAKEPHP」

それではサンプルコードで確認していきましょう。

config/app.php:

<?php
return [
    'Session' => [
        'defaults' => 'php',
        'cookie' => 'CAKEPHP', // デフォルト
        'timeout' => 4320, // 3days
        'cookieTimeout'=> 4320, // 3days
        // iniファイルの設定追記
        'ini' => [
            'session.cookie_lifetime' => 1800, // ページに訪問せず30分経つとクッキーを無効
            'session.gc_divisor' => 1000,
            'session.cookie_httponly' => true
            ]
    ],
];

このサンプルコードでは「php.ini」ファイルの標準セッティングから、クッキー名タイムアウトクッキータイムアウトを変更しています。

また、session.cookie_lifetimesession.gc_divisorなども追加設定しています。

まとめ

ここでは、sessionの使い方について説明しました。

sessionはログイン情報や最終のアクセス情報など、ユーザー個人にひもづくようなデータを格納して使用する場合などによく使われます。

使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次