スライドショー

【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', '[email protected]');
        
        // 連想配列で複数のハッシュを指定して書き込み
        $session->write([
            'person2.name' => 'Jiro',
            'person2.mail' => '[email protected]'
            ]);
        
        // セッションデータの読み込み
        $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', '[email protected]');
        
        // 連想配列で複数のハッシュを指定して書き込み
        $session->write([
            'person2.name' => 'Jiro',
            'person2.mail' => '[email protected]'
            ]);
        
        // セッションデータの読み込み
        $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はログイン情報や最終のアクセス情報など、ユーザー個人にひもづくようなデータを格納して使用する場合などによく使われます。

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

長野 透

長野 透

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説