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

文章页

查看效果

程序员的艺术人生


文章作者: chenggx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 chenggx !
评论
 上一篇
composer 版本约束使用方法 composer 版本约束使用方法
composer 在平常的开发中是经常的使用,但是从来没有特别注意过 composer 包的版本约束,只是知道个大概,秉着活到老学到老的态度再次重新系统的学习下 composer 版本约束的具体规则。 ##语义化版本 首先我们需要先了解一
2020-09-15
下一篇 
git 撤销相关操作 git 撤销相关操作
每次使用 git 需要进行版本回退相关的操作都要在搜索引擎重新查询相关命令,很是费时间,今天有空总结一下,算是记笔记方便以后使用。 撤销本地当前所有修改git reset --hard 如果本地文件修改得一团乱,但是还没有 commit,
2020-09-12
  目录