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

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

詳細はこちら
Laravel

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

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Q&A

解決済

3回答

2279閲覧

どのページでも共通の変数を受け取れるようにしたい(カート内の商品個数を全ページのヘッダーに表示したい)

bokupiroki

総合スコア54

Laravel

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

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

0グッド

0クリップ

投稿2021/03/07 15:36

前提・実現したいこと

  • ECサイトのようなアプリ作成中
  • /mycartにアクセスすればカートに追加した商品の数が表示されるよう設計済み
  • /mycart以外の全てのページでカートに入った商品の数が表示されるようにしたい(ヘッダーに表示したい)

↓こんなイメージです(右上の個数表示)
イメージ説明

発生している問題・エラーメッセージ

現状では、/mycartにアクセスしたときしか
ヘッダーに商品の個数を表示できません。

カート内の商品個数の情報を
ヘッダーの情報などを司る共通テンプレートであるapp.blade.phpに渡せばいいのでは?
と考えたのですが、それもうまくいかない状況です。
(情報が渡せず、数が表示されません)

該当のソースコード

↓ルーティング(web.php)

php

1 Route::get('/mycart', 'ShopController@myCart');//cart内の商品を表示する

↓コントローラー(ShopController.php)

php

1 public function myCart(Cart $cart) 2 { 3 $data = $cart->showCart();//showCartメソッドの実行結果を格納 4 return view('mycart', $data); 5 }

↓モデル(Cart.php)

php

1 public function showCart() 2 { 3 $user_id = Auth::id(); //ログインしているユーザーのIDを取得 4 $data['items'] = $this->where('user_id', $user_id)->get();//ログインユーザーのIDと同じ値を持つuser_idカラムのレコードを連想配列$dataのキー「my_carts」に格納 5 6 $data['count']=0; //カート内の商品の個数は0からカウントアップ 7 $data['sum']=0; //合計金額も0からカウントアップ 8 9 foreach ($data['items'] as $item) { 10 $data['count']++;//繰り返しごとにカウントは1ずつアップ 11 $data['sum'] += $item->stock->fee; 12 } 13 return $data; //連想配列データを実行結果として返す

↓ビュー(app.blade.php)

php

1//中略 2<li> 3 <a class="nav-link" href="{{ url('/mycart') }}"> 4 <i class="fas fa-cart-arrow-down"></i> 5 <span class="circle"> 6 {{$count ??''}}←ここに個数を表示したい 7 </span> 8 </a> 9</li> 10//中略

試したこと

mycart.blade.phpではなく、app.blade.phpに変数を渡せるか、コントローラーのメソッドを書き換えて試しました。

↓コントローラー(ShopController.php)

php

1 public function myCart(Cart $cart) 2 { 3 $data = $cart->showCart();//showCartメソッドの実行結果を格納 4 return view('app', $data); 5 }

変数が渡らないどころか/mycartにアクセスすると
View [app] not found.のエラーが表示されます。

mycart.blade.phpとはファイルパスが違うのでこの書き方はできないのかもしれません。

・アプリディレクトリ\resources\views\layouts\app.blade.php
・アプリディレクトリ\resources\views\mycart.blade.php

共通テンプレートのビューファイルに変数を渡すという発想はそもそも正しいのでしょうか?
また、書き方はあるのでしょうか?

知恵を貸していただきたいです。

補足情報(FW/ツールのバージョンなど)

larabel6

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

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

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

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

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

Lulucom

2021/03/07 15:49 編集

(もしかしたら質問とは関係ないかもしれないのですが) UserとCartが1対多の関係になっていますか? UserとCartが1対1、CartとCartItemが1対多、という関係にするのが一般的ではないのかなと思ったのですが・・・車輪付のカゴがCart、その中に入れている商品たちがCartItemという考えです。
guest

回答3

0

自己解決

下記のサイトを参考にViewComposerを使ったらできました。
http://vdeep.net/laravel-viewcomposer
https://blog.nakamu.life/posts/laravel-viewcomposer-view
(必要ファイル生成のコマンド・読み込み設定は省略)

↓app/Http/ViewComposersCartComposer.php

php

1<?php 2namespace App\Http\ViewComposers; 3use Illuminate\Contracts\View\View; 4use Illuminate\Contracts\Auth\Guard; 5use App\Models\Cart; 6{ 7 /** 8 * @var String 9 */ 10 protected $Cart; 11 public function __construct(Cart $cart) 12 { 13 $this->data = $cart->showCart();//CartモデルにおけるshowCartメソッドの実行結果を格納 14 } 15 /** 16 * Bind data to the view. 17 * @param View $view 18 * @return void 19 */ 20 public function compose(View $view) 21 { 22 $view->with('count', $this->data['count']); 23 } 24}

↓app\Providers\ComposerSeriviceProvider.php

php

1<?php 2namespace App\Providers; 3use View; 4use Illuminate\Support\ServiceProvider; 5use App\Http\ViewComposers\CartComposer;//CartComposerを使うぜ 6class ComposerSeriviceProvider extends ServiceProvider 7{ 8 /** 9 * Bootstrap the application services. 10 * 11 * @return void 12 */ 13 public function boot() 14 { 15 View::composers([ 16 CartComposer::class => [ 17 '*'//全部のビューファイルに変数を渡す 18 ] 19 ]); 20 } 21 /** 22 * Register the application services. 23 * 24 * @return void 25 */ 26 public function register() 27 { 28 // 29 } 30}

投稿2021/03/09 11:34

bokupiroki

総合スコア54

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

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

0

Laravel6ならViewComposer

php

1View::composer('layouts.app', function ($view) { 2 $count = ... 3 $view->with(['count' => $count]); 4});

https://readouble.com/laravel/6.x/ja/views.html

Laravel8ならBladeコンポーネントやLivewire。

countやsumを自分でforeach回して計算なんてしないし、いろいろ壮大に間違ってる気がする。
初心者ほど危険なECを作りたがるのは謎すぎる。

php

1$items = Auth::user()->carts()->get(); 2$count = $items->count();

投稿2021/03/08 00:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

Userモデルのクラスに、現在のカート内の商品数を計算して返すメソッドを作成し、それをlayouts/app.bladeで呼び出すかたちはいかがでしょうか。

php

1{{ Auth::user()->cartItemsCount() }} ←ここに個数を表示したい

投稿2021/03/07 16:46

Lulucom

総合スコア1899

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問