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

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

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

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

PHP

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

Q&A

解決済

2回答

569閲覧

【Laravel】ビューコンポーザー→サービスプロバイダで設定した変数が利用できない

ink88882

総合スコア24

Laravel

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

PHP

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

0グッド

1クリップ

投稿2019/07/06 16:02

編集2019/07/07 13:01

Laravelでビューコンポーザー、サービスプロバイダを利用しています。
ビューコンポーザーのcomposeメソッドで「user」という変数にユーザー情報を取り込んでおります。
また、それを登録しているサービスプロバイダのboot内で、layouts内のページに適用する処理をしています。

ビュー側でページを表示したところ、userが定義されていないエラーが発生します。

ビューコンポーザー、
サービスプロバイダ
ビューの記述を、下記に記載します。
[ビューコンポーザー]

php

1<?php 2 3namespace App\Http\ViewComposers; 4use Illuminate\Contracts\View\View; 5use Illuminate\Contracts\Auth\Guard; 6 7class UserComposer{ 8 protected $auth; 9 10 public function __construct(Guard $auth) 11 { 12 $this->auth = $auth; 13 } 14 15 public function compose(View $view) 16 { 17 $view->with('user', $this->auth->user()); 18 } 19} 20

[サービスプロバイダ側]

php

1<?php namespace App\Providers; 2 3use App\Http\ViewComposers\UserComposer; 4use Illuminate\Support\Facades\View; 5use Illuminate\Support\ServiceProvider; 6 7 8class ComposerServiceProvider extends ServiceProvider 9{ 10 /** 11 * Register services. 12 * 13 * @return void 14 */ 15 public function register() 16 { 17 // 18 } 19 20 /** 21 * Bootstrap services. 22 * 23 * @return void 24 */ 25 public function boot() 26 { 27 View::composers([ 28 UserComposer::class => 'layouts.*' 29 ]); 30 31 } 32} 33

またconfigのprovidersには
App\Providers\ComposerServiceProvider::class,
を追加しています。
この設定の場合、layouts以下のapp.blade.phpで、下記の記述をした際に、ログイン時にエラーが発生します。

{{$user->email}}

なお、

{{ Auth::user()->email }}

にすると正常にuserテーブルのemailが表示されます。

エラーの内容は下記画像のようなものです。
userが定義されていないと言ったエラーのようなのですが、コードから考えられる内容はありますでしょうか。

イメージ説明

追記
利用環境は以下のバージョンとなります。
PHP 7.3.6
Laravel Framework 5.7.28

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

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

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

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

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

m.ts10806

2019/07/07 12:27

ちなみにLaravelとPHPのバージョンはいくつでしょうか。 質問本文に追記してください。
ink88882

2019/07/07 14:50

失礼いたしました!バージョンを追記しました。
guest

回答2

0

ベストアンサー

layouts.appなど、レイアウト用ビューファイル内であれば$userは使えますが、
extendsしている、pages.topなどのビューファイル内では、そのビューファイルに対してビューコンポーザー適用の設定が必要です。

View::composers([ UserComposer::class => 'pages.*' ]);

投稿2019/07/09 03:39

aro10

総合スコア4106

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

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

ink88882

2019/07/09 14:20

こちらの内容にて解決できました! layouts/app.blade.phpの中の変数だったので問題ないと考えておりましたが >extendsしている、pages.topなどのビューファイル内では、そのビューファイルに対してビューコンポーザー適用の設定が必要です。 この通りでした。 適用範囲を広げることで解決できました。 ありがとうございます!
aro10

2019/07/13 01:54

????
guest

0

エラーメッセージがUndefined variable: userということから$userという変数そのものが存在していない状態なので、UserComposercomposeが実行されていないと思われます。実行されていれば値はどうあれ$userは存在した状態になるので、$userが存在していて値がおかしいときのエラーであるTrying to get property 'email' of non-objectになるはずです。

実行されない理由は2つ考えられて、ビューのパスが一致しないか、ビューコンポーザーの登録自体がうまくいっていないかです。パスについてはエラーメッセージから.../resources/views/layouts/app.blade.phpであってlayouts.*とマッチするから問題なさそうなので、ビューコンポーザーの登録がうまくいっていないと思われます。ComposerServiceProviderbootが実行されてるかログを追加するなどして確認してみるといいと思います。

もし実行されてなければComposerServiceProviderのサービスプロバイダとしての登録がうまくいってないので、特に以下の点を確認しましょう。

  • (実行環境がソース開発場所と異なる場合)作成したファイルがもれなくちゃんとデプロイされていますか?
  • config/app.phpを修正する前に作成した設定キャッシュ(php artisan config:cacheで作成するもの)が残っていませんか?

投稿2019/07/09 03:21

crhg

総合スコア1175

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

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

ink88882

2019/07/09 14:21

ご丁寧にありがとうございます! エラーの原因の絞り込み方、とても参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問