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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!