LoginSignup
4
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-18

概要

以前に仕事の関係で
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に書いていますので、そちらを参照してください。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2