[Laravel 5] 筆記18 When You Want a View Partial to Always Receive Data

2015-03-17

https://laracasts.com/series/laravel-5-fundamentals/episodes/25

這節用一個放在 Navigation 上的東西 (最新發表的一篇 article )
示範怎麼獲得通用的資料 而不用每個 method 都寫一遍獲取的程式

首先在 app.blade.php 上加上
▼ resources/views/app.blade.php

    
  • {!! link_to_action('ArticlesController@show', $latest->title, [$latest->id]) !!}
  • 原本應該是要在每個需要顯示的 view 的 controller@method 寫

    $latest = \App\Article::latest()->first();
    

     
    現在可以在一個地方寫通用的方式
    ▼ app/Providers/AppServiceProvider.php

    // 寫在 boot() 裡面
    public function boot()
    {
    	view()->composer('app', function($view)
    	{
        		$view->with('latest',\App\Article::latest()->first());
    	});
    }
    

     
    但為了怕之後越寫越多 所以可以自己另外建立一個 Provider 檔案

    php artisan make:provider ViewComposerServiceProvider
    

    再把程式放在這隻檔案的 boot() 裡面
    ▼ app/Providers/ViewComposerServiceProvider.php

    public function boot()
    {
            // 仍然是怕之後越寫越多會太雜 所以另外寫一個 private method
            $this->composeNavigation();
    }
     
    private function composeNavigation()
    {
    	// 一樣的東西
    	view()->composer('app', function($view)
    	{
        		$view->with('latest',\App\Article::latest()->first());
    	});
    
    	// 之後如果因為獲取的資料會太複雜 沒辦法在這邊簡單獲得的話
    	// 可以建立另外的檔案執行
    	view()->composer('app','App\Http\Composers\NavigationComposer');
    }
    

     
    建立另外的檔案執行 (不過這邊可以先不用 真的萬不得已的時候才這樣建立)
    ▼ app/Http/Composers/NavigationComposer.php

    with('latest',\App\Article::latest()->first());
        }
    }
    

     
    另外建立的 Provider 需要到 confing/app.php 裡面增加一行 才讀得到
    ▼ config/app.php

    return [
    	'providers' => [
    		/* something */
    
    		//增加這行自己新增的 Provider
    		'App\Providers\ViewComposerServiceProvider',
    	],
    ];