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

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

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

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

398閲覧

Laravel5.4で全てのViewにて使用できる値をセットしたい

do_slice

総合スコア26

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/10/14 09:03

Laravel5.4を使用して開発しています。

全ページに表示するお知らせ通知のようなものをヘッダーに表示したいと考えて、
全てのViewで共通で使う値を生成して全てのviewに渡せるようにしたいと思ってます。

Middlewareを作成し、View::shareでできるかなと思ったのですが、
bladeの方で値が取れてないようです。
Bladeの記述を消すとエラーは出ないので、@noticesがbladeに渡せてないのではないかと思うのですが、
追加で必要な設定などはありますでしょうか?
そもそもView::shareの使い方が間違っていますでしょうか?

アドバイスいただけると幸いです。

**App\Http\Middleware\MakeNotices** namespace App\Http\Middleware; use Auth; use Illuminate\Support\Facades\View; use App\Notice; use Closure; class MakeNotices { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if(Auth::check()){ $notices = Notice::where('user_id', '=', Auth::id()) ->where('opened_at', '!=',null) ->orderBy('created_at','asc') ->get(); View::share('notices', $notices); // $request->merge(['notices' => $notices]); // } return $next($request); } }
**App\Http\kernel.php** protected $middleware = [ //省略 \App\Http\Middleware\MakeNotices::class, //追加
**headder.blade.php** //抜粋 @foreach( $notices as $notice ) <li> {{ $notice->created_at }} </li> @endforeach

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。

app/Providers/ComposerServiceProvider.php
を作成。

use View;

class ComposerServiceProvider extends ServiceProvider {
public function boot()
{
// ここにcomposerを使用する処理を記述します
// クラスベースのcomposer
View::composer('*', 'App\Http\ViewComposers\NoticesComposer');

} public function register() { // } }

app/Http/Controllers/ViewComposers/NoticesComposer.php
を作成。

<?php namespace App\Http\ViewComposers; use Illuminate\Contracts\View\View; use App\Notice; use Auth; class NoticesComposer { /** * @var String */ protected $notices; public function __construct() { $this->notices = Notice::where('user_id', '=', Auth::id()) ->where('opened_at', '=',null) ->orderBy('created_at','desc') ->get(); } /** * Bind data to the view. * @param View $view * @return void */ public function compose(View $view) { $view->with('notices', $this->notices); } }

コンソールから
composer dump-autoload
を実行。

無事に共通のメニューViewから$Noticesを呼び出せました。

主にこちらのページを参考にさせていただきました。ありがとうございました。
http://php-archive.net/php/laravel-view-composers/

投稿2017/10/15 01:19

do_slice

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問