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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Laravel

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

PHP

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

Q&A

解決済

1回答

1849閲覧

laravel サービスプロバイダからテンプレートに変数が渡せない

chitan148

総合スコア4

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/04/16 04:58

前提・実現したいこと

今月laravelの学習を始めたばかりの初心者です。
本を使って学習しています。

サービスプロバイダを作成して、bootメソッドの中にView::composer()を作成し、テンプレートへ変数を渡す処理をしていましたが、渡されずに未定義になってしまいます。
コントローラから渡した変数は受け取られて、ブラウザに反映されています。
知人とgithubでコードを共有しており、知人の環境ではエラーは出ず、変数が渡されています。

実現したいこと

下の画像の、= view_messageが、composer message!と表示されるようにしたいです。
この画像は、{{$view_message}}を間違えて{{'view_message'}}と打ってしまった為に、エラーが発覚していなかった時のものです。
イメージ説明

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

Facade\Ignition\Exceptions\ViewException Undefined variable: view_message (View: C:\Users\chi_s\Desktop\laravelapp\resources\views\hello\index.blade.php)

該当のソースコード

index.blade.php.php (子レイアウト)

@extends('layouts.helloapp') @section('title','Index') @section('menubar') @parent インデックスページ @endsection @section('content') <p>ここが本文のコンテンツです。</p> <p>Controller value<br>'message' = {{$message}}</p> <p>ViewComposer value<br>'view_message' = {{$view_message}}</p> @endsection @section('footer') copyright 2020 tuyano. @endsection

この、$view_messageが未定義と言われています。$messageはコントローラから渡されており、受け取られています。

HelloServiceProvider.php (サービスプロバイダ)

<?php namespace App\Providers; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class HelloServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { // } /** * Bootstrap services. * * @return void */ public function boot(){ View::composer('hello.index',function($view){ $view->with('view_message','composer message!'); }); } }

HelloController.php (コントローラ)

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Http\Response; class HelloController extends Controller { public function index() { return view('hello.index',['message'=>'Hello!']); } public function post(Request $request) { return view('hello.index', ['msg'=>$request->msg]); } }

Helloapp.blade.php (親レイアウト)

<html> <head> <title>@yield('title')</title> <style> body {font-size: 16pt; color:#999; margin: 5px; } h1 { font-size: 50pt; text-align: right; color:#f6f6f6; margin: -20px 0px -30px 0px; letter-spacing: -4pt; } ul { font-size:12pt;} hr { margin: 25px 100px; border-top: 1px dashed #ddd;} .menuetitle { font-size: 14pt; font-weight: bold; margin: 0px;} .content { margin:10px;} .footer { text-align: right; font-size: 10pt; margin: 10px; border-bottom: solid 1px #ccc; color: #ccc;} </style> </head> <body> <h1>@yield('title')</h1> @section('menubar') <h2 class="menuetitle">※メニュー</h2> <ul> <li>@show</li> </ul> <hr size="1"> <div class = "content"> @yield('content') </div> <div class = "footer"> @yield('footer') </div> </body> </html>

試したこと

➀laravelの再起動、PC自体の再起動。
変わらず。
➁configフォルダのapp.phpを確認。
classの後に,が無かったので入れてみたけど変わらず。
![イメージ説明]
➂logを出してみる
indexのログしかでない
イメージ説明
イメージ説明
イメージ説明

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

自分の環境
windows10
php7.4.3(xampp)
Laravel Framework 7.3.0
Visual Studio Code

知人の環境
「macでdockerつかってるので実質linux (laradock)」だそうです。
質問者は初心者すぎて意味が分からずそのまま書きました。
コードは、laravelのプロジェクトのlaravelappをgitのリポジトリに丸ごと入れて共有しています。
pullしかしてないそうです。

フレームワークの仕組みがまださっぱりで、お手上げ状態です><
どうぞ宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

自己解決

解決しました(知人が)
######原因はキャッシュでした。
configのログをstorage\logs\laravel.logに出力した所、27こあるはずの'providers'の配列の中身が26こにしかならず、
順番を変えても出力されず、

cmdで、
php artisan config:clear
php artisan chace:clear
この二つを実行した所、**App\Providers\HelloServiceProvider::class,**が出力され27こになり、{{$view_message}}が表示されるようになりました。

どのタイミングでキャッシュされてしまったのかは不明です。
Barryvdh\Debugbar\ServiceProvider::class,がlaravelデバックバーですが、これを入れた時に私はphp artisan config:cacheすることが分かっておらずにしていませんでした。
その後、laravel青本のApp\Provider\He…(略) を本に沿って登録を試み、今回のエラーに至っています。

下のリンクにあるように、Laravel は内部のキャッシュを強く残す性質があるという事なので、サービスプロバイダを登録して読み込まれていない時はキャッシュをクリアしてみよう、という事になりました。

laravel学習帳 Artisanコマンド(キャッシュクリア系・最適化)まとめ
laravel学習帳 laravelデバッグバーの導入

投稿2020/04/17 02:14

chitan148

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問