在我們做網站的時候有些資料是每個檢視頁面都需要的(導航、側邊欄等內容),但如果我們在每個檢視的控制器裡面都寫向檢視傳遞資料的操作則會顯得程式碼比較冗餘。那麼在 laravel 中我們一般可以使用 viewShare 和 viewComposer 的方式來進行檢視頁面資料的共享。
viewShare
首先需要在 AppServiceProvider 中的 boot 方法中定義需要共享的資料。
app/Providers/AppServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
View::share('sitename','xxx的網站');
}
}
定義兩個路由檔案
routes/web.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/product',function(){
return view('product');
});
Route::get('/blog',function(){
return view('blog');
});
在 blog 和 product 檢視頁使用共享的資料
resources/views/blog.blade.php
{{$sitename}}
文章頁
resources/views/product.blade.php
{{$sitename}}
產品頁
驗證效果
viewComposer
設定 composer
有三種方式設定
使用新的provider
在 AppServiceProvider 中的 boot 方法使用基於 viewComposer 的閉包
在 AppServiceProvider 中的 boot 方法使用 viewComposer 成器
使用新的provider
app/Providers/MenuComposerProvider.php
<?php
namespace App\Providers;
use App\Http\View\Composers\MenuComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class MenuComposerProvider extends ServiceProvider
{
public function register()
{
}
public function boot()
{
View::composer('menu',MenuComposer::class);
}
}
在 AppServiceProvider 中的 boot 方法使用基於 viewComposer 的閉包(邏輯比較簡單的話使用該方法)
app/Providers/MenuComposerProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
}
public function boot()
{
// 使用基於合成器的閉包
View::composer('menu', function ($view) {
$view->with('list',['首頁', '文章', '產品']);
}
);
}
}
在 AppServiceProvider 中的 boot 方法使用 viewComposer
app/Providers/MenuComposerProvider.php
<?php
namespace App\Providers;
use App\Http\View\Composers\MenuComposer;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
}
public function boot()
{
View::composer('menu',MenuComposer::class);
}
}
註冊 Provider (後兩種方式不用註冊)
config/app.php
...
'providers' => [
...
App\Providers\MenuComposerProvider::class
],
...
建立 MenuComposer
app/Http/View/Composers/MenuComposer.php
<?php
namespace App\Http\View\Composers;
use Illuminate\View\View;
class MenuComposer
{
public function compose(View $view)
{
$view->with('list', ['首頁', '文章', '產品']);
}
}
建立 menu 檢視檔案
resources/views/menu.blade.php
<ul>
@foreach($list as $menu)
<li>{{$menu}}</li>
@endforeach
</ul>
設定路由
routes/web.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/product',function(){
return view('product');
});
Route::get('/blog',function(){
return view('blog');
});
在 product、blog 檢視檔案中引入 menu 檢視
resources/views/product.blade.php
@include('menu')
產品頁
resources/views/blog.blade.php
@include('menu')
文章頁
檢視效果
本作品採用《CC 協議》,轉載必須註明作者和本文連結