Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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

shkfn
sousei-tech
SOUSEI Technologyは住宅ビルダー事業の知見を活かし、「住宅×IT」で誰も見たことがない暮らしの常識を創り出す、家創りと暮らし創りのエンターテイメント企業です。
https://sousei-tech.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away