前提・実現したいこと
docker環境でlaravelを学習中です。
お手本のサイト
https://note.com/mukae9/n/n103587d08ef2
コントローラーに定義した変数が、viewファイルにうまく渡っていないようなエラーが出て困っています。(変数未定義らしきエラー)
発生している問題・エラーメッセージ
http://localhost/mycart
にアクセスすると
Undefined variable: message (View: /var/www/testapp/resources/views/mycart.blade.php)
とのエラーが表示されます。
「message」なんて変数はないと言われてしまっているように見えます。
該当のソースコード
↓追記
php
1//ルーティング 2//web.php 3 4//(中略) 5Route::get('/', 'ShopController@index'); 6 7Auth::routes(); 8 9Route::get('/mycart', 'ShopController@myCart')->middleware('auth'); 10 11Route::post('/mycart', 'ShopController@addMycart'); 12 13Route::get('/home', 'HomeController@index')->name('home');
php
1//viewファイル 2//mycart.blade.php 3@extends('layouts.app') 4 5@section('content') 6<div class="container-fluid"> 7 <div class=""> 8 <div class="mx-auto" style="max-width:1200px"> 9 <h1 class="text-center font-weight-bold" style="color:#555555; font-size:1.2em; padding:24px 0px;"> 10 {{ Auth::user()->name }}さんのカートの中身</h1> 11 12 <div class=""> 13 <p class="text-center">{{$message}}</p><br> 14 <div class="d-flex flex-row flex-wrap"> 15 16 @foreach($my_carts as $my_cart) 17 <div class="mycart_box"> 18 <p>ユーザーID:{{$my_cart->user_id}}</p> 19 <p>ストックID:{{$my_cart->stock_id}}</p> 20 </div> 21 @endforeach 22 23 </div> 24 25 <a href="/">商品一覧へ</a> 26 </div> 27 </div> 28 </div> 29</div> 30@endsection
php
1//コントローラー 2//ShopController.php 3<?php 4 5namespace App\Http\Controllers; 6 7use App\Models\Stock; 8use Illuminate\Http\Request; 9use Illuminate\Support\Facades\Auth; 10use App\Models\Cart; 11 12 13class ShopController extends Controller 14{ 15 16//中略 17 public function myCart() 18 { 19 $my_carts = Cart::all(); 20 return view('mycart',compact('my_carts')); 21 22 } 23 24 public function addMycart(Request $request) 25 { 26 $user_id = Auth::id(); 27 $stock_id=$request->stock_id; 28 29 $cart_add_info=Cart::firstOrCreate(['stock_id' => $stock_id,'user_id' => $user_id]); 30 31 if($cart_add_info->wasRecentlyCreated){ 32 $message = 'カートに追加しました'; 33 } 34 else{ 35 $message = 'カートに登録済みです'; 36 } 37 38 $carts = Cart::where('user_id',$user_id)->get(); 39 40 41 return view('mycart',compact('my_carts','message')); 42 } 43}
試したこと
コントローラーに当たる「ShopController.php」の末尾(下から3行目)に
return view('mycart',compact('my_carts','message'));
と記載しているので、変数messageは渡せているのでは?
と思い混乱しています。
if文の外側で変数messageを定義しても同じ結果でした。
viewファイルに当たる「mycart.blade.php」の{{$message}}
を削除すると、
エラーは出ずページが表示されました。
↓
なので、変数may_cartsはviewファイルに渡せているのに、
変数messageだけ渡せていないことになると思います。
どなたか知恵を貸していただけないでしょうか。
###試したこと追記
hentaimanさんの回答を元に、関数myCart
のスコープ内に$message = 'hogehoge';
とreturn view('mycart',compact('my_carts','message'));
を記載したところ
確かにエラーが出なくなりました。
php
1//コントローラー 2//ShopController.php 3<?php 4 5namespace App\Http\Controllers; 6 7use App\Models\Stock; 8use Illuminate\Http\Request; 9use Illuminate\Support\Facades\Auth; 10use App\Models\Cart; 11 12 13class ShopController extends Controller 14{ 15 16//中略 17 public function myCart() 18 { 19 $my_carts = Cart::all(); 20 $message = 'hogehoge';//追記 21 return view('mycart',compact('my_carts','message'));//追記 22 23 } 24 25 public function addMycart(Request $request) 26 { 27 $user_id = Auth::id(); 28 $stock_id=$request->stock_id; 29 30 $cart_add_info=Cart::firstOrCreate(['stock_id' => $stock_id,'user_id' => $user_id]); 31 32 if($cart_add_info->wasRecentlyCreated){ 33 $message = 'カートに追加しました'; 34 } 35 else{ 36 $message = 'カートに登録済みです'; 37 } 38 39 $carts = Cart::where('user_id',$user_id)->get(); 40 41 42 return view('mycart',compact('my_carts','message')); 43 } 44}
しかし、関数addMycart
内に記述しているようなif文によって変数message
の内容を変化させる方法がわかりません。
関数myCart
でも
php
1 if($cart_add_info->wasRecentlyCreated){ 2 $message = 'カートに追加しました'; 3 } 4 else{ 5 $message = 'カートに登録済みです'; 6 }
のif文を使うとしたらどうすればいいかが思いつきません。
if文とその前後にコピーして関数myCart
内に貼り付けたり、
変数message
をグローバル変数にしたりしましたが、
うまくいきませんでした。
###試したこと追記2
hentaimanさんのコメントを元に、「myCartでも同じようにパラメーターを受け取って$cart_add_info
を作る」を実践しました。
php
1//コントローラー 2namespace App\Http\Controllers; 3 4use Illuminate\Http\Request; 5use Illuminate\Support\Facades\Auth; 6use App\Models\Cart; 7//中略 8 //↓(Request $request)を追記 9 public function myCart(Request $request) { 10 $my_carts = Cart::all(); 11 12//-----ここから追記----- 13 $user_id = Auth::id(); 14 $stock_id=$request->stock_id; 15 $cart_add_info=Cart::firstOrCreate(['stock_id' => $stock_id,'user_id' => $user_id]); 16 17 if($cart_add_info->wasRecentlyCreated){ 18 $message = 'カートに追加しました'; 19 } 20 else{ 21 $message = 'カートに登録済みです'; 22 } 23 24 return view('mycart',compact('my_carts','message')); 25 } 26//-----ここまで追記----- 27 28 public function addMycart(Request $request) 29 { 30 $user_id = Auth::id(); 31 $stock_id=$request->stock_id; 32 33 $cart_add_info=Cart::firstOrCreate(['stock_id' => $stock_id,'user_id' => $user_id]); 34 35 if($cart_add_info->wasRecentlyCreated){ 36 $message = 'カートに追加しました'; 37 } 38 else{ 39 $message = 'カートに登録済みです'; 40 } 41 42 $carts = Cart::where('user_id',$user_id)->get(); 43 44 45 return view('mycart',compact('my_carts' , 'message')); 46 47 }
しかし、ページにアクセスすると下記のようなエラーが表示されます。
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'stock_id' cannot be null (SQL: insert into `carts` (`stock_id`, `user_id`, `updated_at`, `created_at`) values (?, 1, 2020-12-27 13:43:31, 2020-12-27 13:43:31))
根本的にやり方を間違えているのでしょうか。
###試したこと追記3
hentaimanさんのコメントに基づき、関数myCartを書き換えました。
php
1//ShopContoroller 2 3//中略 4 5 public function addMycart(Request $request) 6 { 7 $user_id = Auth::id(); 8 $stock_id=$request->stock_id; 9 10 $cart_add_info=Cart::firstOrCreate(['stock_id' => $stock_id,'user_id' => $user_id]); 11 12 if($cart_add_info->wasRecentlyCreated){ 13 $message = 'カートに追加しました'; 14 } 15 else{ 16 $message = 'カートに登録済みです'; 17 } 18 19 $carts = Cart::where('user_id',$user_id)->get(); 20 21 22 return view('mycart',compact('carts' , 'message')); 23 24 } 25 //ここから 26 public function myCart(Request $request){ 27 $user_id = Auth::id(); 28 $carts = Cart::where('user_id',$user_id)->get(); 29 //または↓ 30 //$carts = Cart::all(); 31 32 $stock_id=$request->input('stock_id', null) 33 $message = ''; 34 if($stock_id === null){ 35 $message = 'なにもしません'; 36 }else{ 37 $cart_add_info=Cart::firstOrCreate(['stock_id' => $stock_id,'user_id' => $user_id]); 38 if($cart_add_info->wasRecentlyCreated){ 39 $message = 'カートに追加しました'; 40 }else{ 41 $message = 'カートに登録済みです'; 42 } 43 } 44 return view('mycart',compact('carts' , 'message')); 45} 46//ここまで
エディター上で「$message = '';」の部分にエラーがあると表示され、ページにアクセスすると
「syntax error, unexpected '$message' (T_VARIABLE)」のエラーが表示されてしまいました。
補足情報(FW/ツールのバージョンなど)
laravel6.0
php7.3.24
docker20.10.0
mac 10.15.7
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/26 08:23
2020/12/27 12:38
2020/12/27 12:49
2020/12/27 13:50
2020/12/27 14:13
2020/12/27 14:42
2020/12/31 09:42
2020/12/31 10:01