🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

1回答

1927閲覧

コントローラーからviewファイルに変数を渡せない(?)

bokupiroki

総合スコア54

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/12/26 07:46

編集2020/12/31 09:41

前提・実現したいこと

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

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

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

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

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

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

guest

回答1

0

function addMycartにはmessageあるけどfunction myCartにはmessageないからmyCartのルートに行ってるだけでしょう 多分ね

追記

どういう意図の設計なのかいまいち分かりませんが、以下のような事をやりたい?

public function myCart(Request $request){ $user_id = Auth::id(); $carts = Cart::where('user_id',$user_id)->get(); //または↓ //$carts = Cart::all(); $stock_id=$request->input('stock_id', null) $message = ''; if($stock_id === null){ $message = 'なにもしません'; }else{ $cart_add_info=Cart::firstOrCreate(['stock_id' => $stock_id,'user_id' => $user_id]); if($cart_add_info->wasRecentlyCreated){ $message = 'カートに追加しました'; }else{ $message = 'カートに登録済みです'; } } return view('mycart',compact('carts' , 'message')); }

投稿2020/12/26 08:05

編集2020/12/27 14:11
hentaiman

総合スコア6426

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

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

bokupiroki

2020/12/26 08:23

ありがとうございます。 確かにそうかもしれません。 後ほど確認して結果を報告します。
bokupiroki

2020/12/27 12:38

おっしゃる通り、試しに$messageを関数myCart内で定義すればエラーが出なくなりました。 しかし、もともとやりたかったif文を使って表示されるメッセージを変化させる方法がわからずにいます。 試したことを追記したので、質問欄をご確認いただけると幸いです。
hentaiman

2020/12/27 12:49

質問に記載されている範囲の事しか分かりませんが、少なくとも > $request->stock_id; を元に > $cart_add_info=Cart::firstOrCreate(['stock_id' => $stock_id,'user_id' => $user_id]); で取得したデータを元にifで判断した訳ですから、myCartでも同じようにパラメーターを受け取って$cart_add_infoを作る必要があります ただ恐らくmycartは現状を表示するだけのアクションだと思うので$message自体が不要で、むしろ何かしら追加する時のアクション先(formタグのactionの指定)をaddMycartのルートにする必要があるでしょう 以上が質問内容から推測できる、やりたいであろう事を実現するための回答です。 そうではなく全く別の条件を元にしたifを使ってmessageを切り替えたいのならその情報も質問に書いてないと分かりません(書いてあっても回答出来るかは分かりませんが)
bokupiroki

2020/12/27 13:50

ありがとうございます。 やりたいことは、推測していただいたことの通りであっています。 「試したこと2」を質問欄に追記しました。 もしかしたら何かもっと最初の段階で根本的なミスをしているのかも知れません。 ほかの部分も含め、引き続き見直しをします。
hentaiman

2020/12/27 14:13

どういうルーティングで各アクションがどういう意図で分けられているのか分かりませんが、てきとーにコードを書き替えてみました。(動作未検証)
hentaiman

2020/12/27 14:42

ちなみに試した事2でエラーが出ているのは、firstOrCreateがstock_idを取れる前提の処理だからなので、stock_idを取れるか取れないかで事前の切り分けが必要です。(それが追記内容)
bokupiroki

2020/12/31 09:42

遅くなり申し訳ありません。 いただいたコードを試した結果を質問欄に記載しました。 引き続き調査いたします。
hentaiman

2020/12/31 10:01

エラーの上の行でセミコロン無いね こんな事やりたいのかな?って言うのをサラッとコードに落としただけで動作未確認なので、シンタックスエラーなどはテキトー直して使ってください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問