laravel 视图数据共享

在我们做网站的时候有些数据是每个视图页面都需要的(导航、侧边栏等内容),但如果我们在每个视图的控制器里面都写向视图传递数据的操作则会显得代码比较冗余。那么在 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 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!