セッション変数の読み書きをもっとかんたんに!

セッション変数の 読み/書き って、意外と面倒じゃないですか?

  • キー名って何だっけ?
  • そうそう、あのコントローラーで代入していたから、コントローラー内から見つけてキー名をクリップボードにコピーしよう。
  • それで他にも影響する 読み/書き はなかったかな?キー名で探さなければ。

セッション変数毎に、専用のクラスを作るのです

これが私の答えです。

namespace App\Http\Sessions;

/**
 * 問い合わせフォーム セッション変数
 */
final class InquiryFormSession
{
    public const SESSION_NAME = 'inquiry_form_session';

    public static function put(
        string $subject,
        string $name,
        string $message,
    ): void {
        session()->put(
            key: self::SESSION_NAME,
            value: [
                'subject' => $subject,
                'name'    => $name,
                'message' => $message,
            ]
        );
    }

    public static function get(): ?array
    {
        return session()->get(self::SESSION_NAME);
    }

    public static function pull(): ?array
    {
        return session()->pull(self::SESSION_NAME);
    }
}

さらに応用して

キー名や型が漠然としている array を追放するのです。

put は簡単になりましたが、get したあとの難易度が高いです。なぜなら array が返ってくるのです。

うろ覚えのキー名をtypoなく思い出せますか?プロジェクト内のソースコードを探しますか?やめましょう。その解決方法が下記です。

(1) まず、Data Transfer Object (DTO) を作ります。

namespace App\Data;

final class InquiryFormData
{
    /**
     * @param  string  $subject  件名
     * @param  string  $name  氏名
     * @param  string  $message  問合せ本文
     */
    public function __construct(
        string $subject,
        string $name,
        string $message,
    ) {
    }
}

(2) つづいて、InquiryFormSession クラス内の put, get, pull メソッドの引数や戻り値の型を array から InquiryFormData に変更します。

namespace App\Http\Sessions;

use App\Data\InquiryFormData;

/**
 * 問い合わせフォーム セッション変数
 */
final class InquiryFormSession
{
    public const SESSION_NAME = 'inquiry_form_session';

    public static function put(InquiryFormData $formData): void
    {
        session()->put(
            key: self::SESSION_NAME,
            value: $formData,
        );
    }

    public static function get(): ?InquiryFormData
    {
        return session()->get(self::SESSION_NAME);
    }

    public static function pull(): ?InquiryFormData
    {
        return session()->pull(self::SESSION_NAME);
    }
}

(3) array が追放できました。セッション変数に代入するにはこう書きます。

namespace App\Http\Controllers;

use App\Data\InquiryFormData;
use App\Http\Sessions\InquiryFormSession;
use Illuminate\Http\Request;

class InputInquiryController extends Controller
{
    public function __invoke(Request $request)
    {
        InquiryFormSession::put(
            new InquiryFormData(
                subject: $request->input('subject'),
                name: $request->input('name'),
                message: $request->input('message'),
            ),
        );
    }
}

(4) セッション変数の値を参照するにはこう書きます。

namespace App\Http\Controllers;

use App\Http\Sessions\InquiryFormSession;

class ConfirmInquiryController extends Controller
{
    public function __invoke(Request $request)
    {
        $session = InquiryFormSession::get();

        return view('inquiry.confirm')->with([
            'session' => $session,
        ]);
    }
}

最初に言ったこんな面倒なことがなくなります

  • キー名って何だっけ?
  • そうそう、あのコントローラーでセッションに代入していたから、コントローラー内から目視で見つけてキー名をクリップボードにコピーしよう。
  • それで他にも影響する 読み/書き はなかったかな?キー名で探さなければ。

まだ改善できます

$request->input('subject')
$request->input('name')

もうこの記述はしたくありませんね。なぜなら array のキーと同様に typo の原因です。

フロントエンドからのリクエストを自動的にオブジェクトにマッピングするには下記の記事を参照ください。

それでは今回の記事はここまで。
また次回お会いしましょう。