CakePHP 4 で保存したセッション情報を他プログラムで取得する方法

はじめに

CakePHP と他プログラムを共存するときに、CakePHP で保存したセッション情報を他プログラムで取得できないことがあります。

今日は CakePHP 4 をサブフォルダに設置した場合に、
CakePHP で保存した セッション情報を他プログラムで取得する方法 をご紹介します。

今回使用したのは CakePHP 4.0.7 です。

目次
  1. 設定方法
  2. 動作確認に使ったプログラム
  3. おわりに

1. 設定方法

対応は簡単で、CakePHP の設定ファイルに下記を追加するだけです。

config/app.php
return [
    ...
    'Session' => [
        ...
        // ▼ これを追加
        'ini' => [
            'session.cookie_path' => '/'
        ]
    ]
];

これはセッションが有効となるパスの範囲を表しています。

例えば、CakePHP と セッション情報をやり取りしたい他プログラムが、
ともに https://example.com/hoge/ 以下にある場合は、
session.cookie_path は '/hoge' の方が望ましいと思います。

2. 動作確認に使ったプログラム

今回は CakePHP でつくったプログラムを https://example.com/cake4 に設置し、他プログラムとして https://example.com/test.php をつくり、その間でセッション情報のやり取りを確認しました。

CakePHP 4 で作ったサンプルコントローラです。モデル、テンプレは不要です。
/cake4/sample にアクセスするとセッション情報が保存されます。

/cake4/src/Controller/SampleController.php
<?php
declare(strict_types=1);

namespace App\Controller;

use Cake\Core\Configure;

class SampleController extends AppController
{
    public function initialize(): void
    {
        $this->session = $this->getRequest()->getSession();
    }

    public function index()
    {
        $this->session->write('visited', date('H:i:s'));

        return $this->redirect(['action' => 'check']);
    }

    public function check()
    {
        debug($this->session->read('visited'));
        exit;
    }
}

他プログラムとしてつくった test.php です。CakePHP で保存したセッション情報が読み取れることを確認します。

/test.php
<?php
session_start();

var_dump($_SESSION);

あとは CakePHP を /sub1/cake4 に入れてみたり、test.php の複製を /sub1/test.php や /sub1/sub1-2/test.php、/sub2/test.php に作ったりすると、挙動を確かめることができると思います。

3. おわりに

個人的には CakePHP と他プログラムでセッション情報やり取りする場合がたまにあります。

例えば、既存プログラムとの同居や、部分的に CakePHP 化するケースです。

必要なときに困らないように、config/app.php の設定変更でできることや cookie_path というキーワードを頭の片隅に残しておくと良いのかなと思います。