Laravelでフォーム入力から確認画面経由してDB登録するまでの流れをサポートするライブラリを作ってみた


概要

以前に仕事の関係で
1. フォーム入力画面
2. 入力内容の確認画面
3. DB登録
の画面遷移フローの実装―フォームに入力した内容をセッションを使って持ち回す、昔ながらのパターン―を共通化したい。つまりライブラリ化して欲しい、という要望を受けて作ったLaravel用ライブラリの存在を思い出したので、githubにアップしてみました。対応バージョンはLaravel5.5以上としています。(公開したところで使う人いるんだろうか・・・?という疑問はこの際一旦置いておくことにします)
https://github.com/shkfn/transaction-parameter

2018-07-25追記
このライブラリのデモプロジェクトを作成しました。
https://github.com/shkfn/transaction-demo

使用例

こんな感じで、トークンと共にパラメータ管理をサポートするライブラリです。

TransactionController.php
namespace App\Http\Controllers;

use Shkfn\TransactionParameter\Transaction;
use App\Http\Requests\InputRequest;

class TransactionController extend Controller
{
    /** @var Transaction */
    protected $transaction;

    public function __construct(Transaction $transaction)
    {
        $this->transaction = $transaction;
    }

    /**
     * 入力画面表示
     * @param string $token
     */
    public function input($token = null)
    {
        $params = null;
        if (is_null($token)) {
            $token = $this->transaction->start(); // tokenがnullか引数無しの場合に新しいtokenを発行して返却
        } else {
            // token付きで入力画面に戻ってきた場合にパラメータを引き出せる
            if ($this->transaction->start($token)) { // tokenが渡された場合は保存領域でtokenの存在確認をbool返却
                $params = $this->transaction->get(); // パラメータ取得。格納値が無い場合は空配列が返る。
            } else {
                return abort(404);
            }
        }
        return view('input', ['token' => $token,'params' => $params]); // tokenはルートパラメータとして使用
    }

    /**
     * 入力バリデーション
     * @param InputRequest $request
     * @param string $token
     */
    public function validateInput(InputRequest $request, $token)
    {
        // token毎に区切られた領域に保存
        if ($this->transaction->start($token)) {
            $params = $request->validated();
            $this->transaction->put($params); // バリデーション済みの値を保存。第2引数に文字列でタグを設定可能。タグを設定して保存した場合は、get時にもタグの指定が必要。
            return redirect(route('confirm', ['token' => $token]));
        }
        return back();
    }

    /**
     * 確認画面表示
     * @param string $token
     */
    public function confirm($token)
    {
        if ($this->transaction->start($token)) { // tokenを使ってトランザクションを再開
            $params = $this->transaction->get();
            return view('confirm', ['token' => $token, 'params' => $params]);
        }
        return redirect(route('input')); // 入力画面やエラー画面等へリダイレクト
    }

    /**
     * 登録処理
     * @param string $token
     */
    public function register($token)
    {
        if ($this->transaction->start($token)) { // tokenを使ってトランザクションを再開
            $params = $this->transaction->get();
            Post::create($params); // DB登録
            $this->transaction->close(); // tokenの保存領域を明示的にクリアするメソッド
            return redirect(route('complete')); // 完了メッセージを表示する画面等へリダイレクト
        }
        return redirect(route('input')); // 入力画面やエラー画面等へリダイレクト
    }
}

最後に

念のため書き添えておきますと、仕事の関係で作ったと申しましても、このライブラリについては特定の機密を含まない事もあって、公開についての了承は得ています。作ったままの物を公開しても良い事になっているのですが、元々の状態から多少アレンジを加えています。
使い方の詳細についてはリポジトリのreadme.mdに書いていますので、そちらを参照してください。