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

文章页

查看效果

程序员的艺术人生

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值