LoginSignup
3
1

More than 1 year has passed since last update.

Vue + Laravelでformの入力情報をパラメーターから受け取り、復元する方法

Last updated at Posted at 2021-08-27

はじめに

一週間前から初めて触るVue + Laravelの環境で新規案件を開発しはじめました。
入力フォームの情報を確認画面に渡し、入力ミスなどで入力フォームに戻る際に、Laravelでフォームの情報を受け渡ししようかと奮闘しましたができず、結局Javascriptの力技で解決しました。。。多分
本来のやり方ではないと思いますが、良かったら参考にしてください。

環境

  • バックエンド:PHP - Laravel8
  • フロントエンド:Vue.js
  • DB:Mysql ver8.0
  • Docker使用

最初にやろうとしたこと

新規入力フォーム

userCreate.vue
<template>
  <form @submit.prevent="submit">
    <label for="name">名前</label>
    <input type="text" id="name" name="name" v-model="form.name" />
    <label for="email">メールアドレス</label>
    <input type="text" id="email" name="email" v-model="form.email" />
    <button name="test" type="submit">送信</button>
  </form>
</template>

<script>

//中略

export default {
     props: {
    user: Object,
  },

  data() {
    return {
             // 戻った時に予め入力していた値を受け取り、フォームに復元する
      form: this.$inertia.form({
        name: this.user.name,
        email: this.user.email,
      }),
    };
  },

  methods: {
    submit() {
      this.form.post(this.route("userconfirm"));
    },
  },
};
</script>

入力確認フォーム

userConfirm.vue
<template>
  <form @submit.prevent="submit">
    <table>
      <tbody>
        <tr>
          <td>名前</td>
          <td>{{ user.name }}</td>
        </tr>
        <tr>
          <td>email</td>
          <td>{{ user.email }}</td>
        </tr>
      </tbody>
    </table>
    <button name="back" type="submit">戻る</button>
    <button name="send" type="submit">送信</button>
  </form>
</template>

<script>

//中略

export default {
     props: {
    user: Object,
  },

  data() {
    return {
      form: this.$inertia.form({
        name: this.user.name,
        email: this.user.email,
      }),
    };
  },

  methods: {
    submit() {
      // data()内のformデータをコントローラに送る
      this.form.post(this.route("usercomplate"));
    },
  },
};
</script>

laravel側コントローラー

userController.php
<?php

namespace App\Http\Controllers;

use Inertia\Inertia;
use Illuminate\Http\Request;
use App\Models\User;

class UserController extends Controller
{
    public function create()
    {
        return Inertia::render('Mypage/UserCreate');
    }

    public function confirm(Request $request)
    {

        $user = $request->all();
        return Inertia::render('Mypage/UserConfirm', ['user' => $user]);
    }

    public function complete(Request $request)
    {
      if($request->has('send')){

        // ここに保存の処理

      }elseif($request->has('back')){
        // ここに新規入力フォームに戻る処理
        $user = $request->all();
        return Inertia::render('Mypage/UserConfirm', ['user' => $user]);
      }
    }
}

ボタンのnameを受け取りif文で条件分岐処理を行うのがLaravelのベストプラクティスかと思われますが、どうやってもname属性を受け渡しできずにLaravelでの処理は諦めました。。。。。

URLから受け取る処理をVueで実装する

新規入力フォーム

userCreate.vue
<template>
  <form @submit.prevent="submit">
    <label for="name">名前</label>
    <input type="text" id="name" name="name" v-model="form.name" />
    <label for="email">メールアドレス</label>
    <input type="text" id="email" name="email" v-model="form.email" />
    <button type="submit">送信</button>
  </form>
</template>

<script>

//中略

export default {
     props: {
    user: Object,
  },

  data() {
        //  ①ここを追加
        let url = new URL(window.location.href);
    let params = url.searchParams;
    return {
             // ②パラメータを受け取り、フォームに復元する
      form: this.$inertia.form({
        name: params.get("name"),
        email: params.get("email"),
      }),
    };
  },

  methods: {
    submit() {
      this.form.post(this.route("userconfirm"));
    },
  },
};
</script>

入力確認フォーム

userConfirm.vue
<template>
  <form @submit.prevent="submit">
    <table>
      <tbody>
        <tr>
          <td>名前</td>
          <td>{{ user.name }}</td>
        </tr>
        <tr>
          <td>email</td>
          <td>{{ user.email }}</td>
        </tr>
      </tbody>
    </table>
    <div @click="backpage">戻る</div>
    <button type="submit">送信</button>
  </form>
</template>

<script>

//中略

export default {
     props: {
    user: Object,
  },

  data() {
    return {
      form: this.$inertia.form({
        last_name: this.user.name,
        email: this.user.email,
      }),
    };
  },

  methods: {
    submit() {
      this.form.post(this.route("usercomplete"));
    },
        // 入力値が含まれるパラメーターを送る
    backpage() {
      this.form.get(this.route("usercreate"));
    },
};
</script>

[戻る]をクリックしbackpageメソッド実行されると、下記のような入力データが入ったパラメータが送られるため①でURLを取得し、②で各項目をGetしてからdataに初期値を渡す。

http://localhost:8080//user/create?name=foobar&email=test@test.com

参考サイト

URLに含まれるGETパラメータを取得する
Laravelにて1つのFormで複数ボタンを実装する際の備忘録

正しい方法ではないかもしれませんがご参考まで

3
1
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
3
1