Laravel 5.5 多视图共享数据

1. 所有视图共享数据

Laravel 文档介绍=> 视图

如果需要共享一段数据给应用程序的所有视图,你可以在服务提供器的 boot 方法中调用视图 Facadeshare 方法。例如,可以将它们添加到 AppServiceProvider 或者为它们生成一个单独的服务提供器:

App\Providers\AppServiceProvider.php

 .
 .
 .
 public function boot()
    {
        // 全局共享数据
        // view()->share('share', '我是共享数据');
        // View::share('key', '我也是共享数据');
        // View::share('channels',\App\Models\Channel::all());

        // 中文友好时间戳
        \Carbon\Carbon::setLocale('zh');
    }

resources\views\layouts\app.blade.php 【任意 blade 】

 {{ $share }}

 {{ $key }}

此时就可以看到效果了;

2. 视图合成器(多视图共享数据)

视图合成器是在渲染视图时调用的回调或者类方法。如果你每次渲染视图时都要绑定视图的数据,视图合成器可以帮你将这些逻辑整理到特定的位置。

在下面这个例子中,我们会在一个 服务提供器 中注册视图合成器,使用 View Facade 来访问底层的 Illuminate\Contracts\View\Factory 契约实现。默认情况下,Laravel 没有存放视图合成器的目录,你需要根据喜好来重新建立目录,例如:App\Http\ViewComposers

1). 注册一个 ComposerServiceProvider

App\Providers\ComposerServiceProvider.php

 <?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * 在容器中注册绑定
     * https://learnku.com/docs/laravel/5.5/views/1299#sharing-data-with-all-views
     *
     * @return void
     */
    public function boot()
    {
        // 使用基于类的 composer...
        // 将视图构造器添加到多个视图
        View::composer(
            ['layouts.app'],
            'App\Http\ViewComposers\WebComposer'
        );

        // 使用基于闭包的 composers...
        // View::composer('*', function ($view) {
        //
        // });
    }

    /**
     * 注册服务器提供者
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

{note} 注意,如果你创建了新的一个服务提供器来存放你注册视图合成器的代码,那么你需要将这个服务提供器添加到配置文件config/app.phpproviders 数组中。

2). 配置刚注册的 ComposerServiceProvider

config/app.php

...
'providers'=> [
    ...
    // 视图合成器 https://learnku.com/docs/laravel/5.5/views/1299#sharing-data-with-all-views
    App\Providers\ComposerServiceProvider::class,
]
...

3). 定义 视图合成器类

到此我们已经注册了视图合成器,每次渲染 layouts.app 视图时都会执行 WebComposer@compose 方法。那么下面我们来定义视图合成器的这个类吧:

App\Http\ViewComposers\WebComposer.php

<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Models\User;

class WebComposer
{
    // 当前登录用户
    protected $currentUser;

    /**
     * 创建一个新的 profile composer
     *
     * @return void
     */
    public function __construct(User $user)
    {
        // 当前登录用户 id
        $authId = \Auth::user()->id;

        // 获取当前登录用户 信息
        $this->currentUser = $user
            ->select('users.*', 'images.path as avatar_path', 'user_infos.*')
            ->where('users.id', '=', $authId)
            ->leftJoin('images', function ($join){
                $join->on('images.user_id', '=', 'users.id')
                    ->where('images.image_type', '=', 'avatar');
            })
            ->leftJoin('user_infos', 'user_infos.user_id', '=', 'users.id')
            ->first();
    }

    /**
     * 将数据绑定到视图。
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with(['common'=> [
            'auth'=> $this->currentUser,
        ]]);
    }
}

resources\views\layouts\app.blade.php

// 当前账号用户名
{{ $common['auth']['name'] }}
讨论数量: 0

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