laravel 檢視資料共享

chenggx 發表於 2020-09-15

在我們做網站的時候有些資料是每個檢視頁面都需要的(導航、側邊欄等內容),但如果我們在每個檢視的控制器裡面都寫向檢視傳遞資料的操作則會顯得程式碼比較冗餘。那麼在 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}}

產品頁

驗證效果

laravel 檢視資料共享

laravel 檢視資料共享

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')

文章頁

檢視效果

laravel 檢視資料共享

laravel 檢視資料共享

程式設計師的藝術人生

本作品採用《CC 協議》,轉載必須註明作者和本文連結