質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

1616閲覧

[laravel+vue]vueでフォームリクエストした際、変更していない値が空白値で書き換わる

DaisukeMori

総合スコア225

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2019/08/15 12:56

編集2019/08/15 20:21

環境

サーバーサイド
Laravel

フロントエンドサイド
Vue
ログインにはjwt-auth使用 参考

DB

Laravelの標準のユーザーテーブル
$ php artisan make:auth
$ php artisan migrate
↓以下テーブル生成
users_table
id(A_I)
name
email
password(b-cryptによりハッシュ化されて登録される設定)
remenber_token
created_at
updated_at

できていること

vueとLaravel間で値を受け渡しと受け取り
新規登録・ログイン・ユーザー情報描画まで実装済

問題点

ユーザーテーブルのname・emailカラムのみ編集フォームを実装し、
変更はできたのですが、なぜか指定してないpasswordカラムに空白値(nullではない)が入ってしまいます(空文字にハッシュ化された状態)。
また、それならpasswordカラムに同値を入れればいいのかと思い、やってみたところ
b-cryptでハッシュ化されているため、この値でDBを入れ替えるとさらにハッシュ化されてしまいうまく整合できなくなってしまいます。

要件

nameとemailのみ変更
(変更していないカラムが勝手に変わらないようにしたい)

現在のコード

vue

1<template> 2 <div class="container"> 3 <div v-if="!editFlg"> 4 ID: {{ user.id }}<br /> 5 ユーザー名: {{ user.name }}<br /> 6 メール: {{ user.email }}<br /> 7 登録日: {{ user.created_at }}<br /> 8 更新日: {{ user.updated_at }} 9 </div> 10 11 <form v-else> 12 <input type="text" name="name" v-model="user.name"> 13 <input type="email" name="email" v-model="user.email"> 14 </form> 15 <button v-if="!editFlg" @click="(editFlg = true)">編集</button> 16 <button v-else @click="onUpdate">更新</button> 17 18 </div> 19</template> 20 21<script> 22 export default { 23 data: function() { 24 return { 25 isError: false, 26 user: {}, 27 editFlg: false, 28 updated: false 29 } 30 }, 31 created() { 32 axios.get('/api/me').then(res => { 33 this.user = res.data; 34 }).catch(error => { 35 this.isError = true; 36 }); 37 }, 38 methods: { 39 onUpdate: function() { 40 axios.put('/api/users/' + this.user.id, { 41 name: this.user.name, 42 email: this.user.email, 43 }) 44 .then( (res) => { 45 this.editFlg = false; 46 this.updated = true; 47 console.log('update') 48 }).catch(error => { 49 this.isError = true; 50 }); 51 } 52 }, 53 } 54</script>

Laravelコード

php

1//app/User.php 2namespace App; 3 4use Tymon\JWTAuth\Contracts\JWTSubject; 5use Illuminate\Notifications\Notifiable; 6use Illuminate\Foundation\Auth\User as Authenticatable; 7 8class User extends Authenticatable implements JWTSubject 9{ 10 use Notifiable; 11 12 protected $fillable = ['name', 'email', 'password']; 13 protected $guarded = ['id' ]; 14 protected $hidden = ['remember_token',]; 15 16 public function getJWTIdentifier() 17 { 18 return $this->getKey(); 19 } 20 21 public function getJWTCustomClaims() 22 { 23 return []; 24 } 25}

php

1//app/Http/Controllers/AuthController.php 2namespace App\Http\Controllers; 3 4class AuthController extends Controller 5{ 6 function login() { 7 $credentials = request(['email', 'password']); 8 9 if (!$token = auth('api')->attempt($credentials)) { 10 return response()->json(['error' => 'Unauthorized'], 401); 11 } 12 13 return $this->respondWithToken($token); 14 } 15 16 public function logout() 17 { 18 auth()->logout(); 19 return response()->json(['message' => 'ログアウトしました。']); 20 } 21 22 public function me() 23 { 24 return response()->json(auth()->user()); 25 } 26 27 protected function respondWithToken($token) 28 { 29 return response()->json([ 30 'access_token' => $token, 31 'token_type' => 'bearer', 32 'expires_in' => auth("api")->factory()->getTTL() * 60 33 ]); 34 } 35} 36

php

1//app/Http/Controllers/UserController.php 2namespace App\Http\Controllers; 3 4use App\User; 5use Illuminate\Http\Request; 6use App\Http\Resources\User AS UserResource; 7 8class UserController extends Controller 9{ 10 // 一覧表示 11 public function index() { 12 return UserResource::collection(User::all()); 13 } 14 15 // 保存 16 public function store(Request $request) { 17 $user = new User; 18 $user->name = $request->input('name'); 19 $user->email = $request->input('email'); 20 // bcrypt関数でハッシュ化してくれる 21 $user->password = bcrypt($request->input('password')); 22 23 $user->save(); 24 } 25 26 // 1データ表示 27 public function show(User $user) { 28 return new UserResource($user); 29 } 30 31 // 更新 32 public function update(Request $request, User $user) { 33 $user->name = $request->input('name'); 34 $user->email = $request->input('email'); 35 // bcrypt関数でハッシュ化してくれる 36 $user->password = bcrypt($request->input('password')); 37 $user->save(); 38 } 39 40 // 削除 41 public function destroy(User $user) { 42 $user->delete(); 43 } 44}

php

1//app/Http/Resources/User.php 2 3namespace App\Http\Resources; 4 5use Illuminate\Http\Resources\Json\Resource; 6 7class User extends Resource 8{ 9 public function toArray($request) 10 { 11 return [ 12 'id' => $this->id, 13 'name' => $this->name, 14 'email' => $this->email, 15 'password' => $this->password, 16 'date' => $this->created_at->format('Y-m-d H:i:s'), 17 ]; 18 } 19}

php

1//routes/api.php 2 3use Illuminate\Http\Request; 4 5Route::middleware('auth:api')->get('/user', function (Request $request) { 6 return $request->user(); 7}); 8 9Route::post('/login', 'AuthController@login'); 10 11Route::group(['middleware' => 'auth:api'], function () { 12 Route::get('/me', 'AuthController@me'); 13 Route::post('/logout', 'AuthController@logout'); 14}); 15 16Route::resource('users', 'UserController');

php

1//routes/web.php 2 3Route::get('/home', 'HomeController@index')->name('home'); 4 5Route::any('{all}', function () { 6 return view('app'); 7})->where(['all' => '.*']);

php

1//resources/views/app.blade.php 2 3<!doctype html> 4<html lang="ja"> 5<head> 6 <meta charset="utf-8"> 7 <title>Job+</title> 8 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 9 <link href="{{ mix('/css/app.css') }}" rel="stylesheet"> 10 <link href="{{ asset('/css/clearfix.css') }}" rel="stylesheet"> 11 <link href="{{ asset('/css/style.css') }}" rel="stylesheet"> 12 <meta name="csrf-token" content="{{ csrf_token() }}"> 13</head> 14<body> 15<div id="app"> 16 <app></app> 17 <router-view></router-view> 18</div> 19<script src="{{ mix('/js/app.js') }}"></script> 20</body> 21</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikkame

2019/08/15 13:49

Vue側は問題ないように思えます。Laravel側のコードはどんな感じでしょうか。
DaisukeMori

2019/08/15 20:15

Laravel側追加しました。
guest

回答1

0

ベストアンサー

// 更新 public function update(Request $request, User $user) { $user->name = $request->input('name'); $user->email = $request->input('email'); // bcrypt関数でハッシュ化してくれる $user->password = bcrypt($request->input('password')); $user->save(); }

ここで必ずpasswordが更新されています。
passwordがセットされていれば、更新、されていなければ何もしない、という風にする必要があります

Vueは関係ないので、取り敢えず普通のFORMかPOSTMANで期待の動作をするかどうか確かめてから
Vueが問題か考えてみてはどうでしょうか?

投稿2019/08/16 04:27

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DaisukeMori

2019/08/19 09:56

ご回答ありがとうございました。 パスワードリクエストがあったらという分岐をつくってあげたら、 パスワードが意図なく書き換わることがなくなりました。 一応修正コードアップしておきます。 ``` //app/Http/Controllers/UserController.php //中略 // 更新 public function update(Request $request, User $user) { $user->name = $request->input('name'); $user->email = $request->input('email'); // パスワードリクエストがあったら書き換え(なければ何もしない) if($request->input('password')) { $user->password = bcrypt($request->input('password')); } $user->save(); } //中略 ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問