您现在的位置是:网站首页 > 心得笔记

laravel框架中视图合成器的使用

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

例如:我整个博客项目中很多地方都在使用数据博客名称、备案号等公共的信息。如果不使用试图合成器,我们要做的就是在需要显示的地方查一次数据。这样,造成了代码复用!
 
但是,如果我使用了视图合成器,那效果是完全不一样的,下面我将详细讲述我使用试图合成器的流程,希望对你有所帮助!


1、注册视图合成器


使用 View Facade 来访问底层的 Illuminate\Contracts\View\Factory 契约实现

<?php

namespace App\Providers;

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

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * 在容器中注册绑定。
     *
     * @return void
     */
    public function boot()
    {
        // 使用基于类的 composer...
        View::composer(
            ['/front/index/app','front/notes/index','front/post/index'],
            'App\ViewComposers\SiteComposer'
        );

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

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


注意,这里我创建了新的一个服务提供器来存放我视图合成器的代码,所以我还需要将这个服务提供器添加到配置文config/app.php 的 providers 数组中。!!!

  'providers' => [
  
        App\Providers\ComposerServiceProvider::class,
  
    ],


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


2、定义视图合成器类

默认情况下,Laravel 没有存放视图合成器的目录,你需要根据喜好来重新建立目录,例如我这里建立的目录:App\ViewComposers。

<?php

namespace App\ViewComposers;

use Illuminate\View\View;
use App\Model\Admin\Site;

class SiteComposer
{

    protected $site;


    public function __construct(Site $site)
    {
        // 依赖关系由服务容器自动解析...
        $this->site = $site;
    }

    /**
     *  将数据绑定到视图。
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('site', $this->site->getFirstCached());//查取需要显示的数据绑定到视图,视图中通过$site便可获取数据
    }
}



App\Model\Site.php中获取数据的方法:

public function getFirstCached()
    {
        // 尝试从缓存中取出 cache_key 对应的数据。如果能取到,便直接返回数据。
        // 否则运行匿名函数中的代码来取出活跃用户数据,返回的同时做了缓存。
        return Cache::remember($this->cache_key, $this->cache_expire_in_minutes, function(){
            return $this->first();
        });
    }



视图合成器的 compose 方法会在视图渲染之前被调用,并传入一个 Illuminate\View\View 实例。你可以使用 with 方法将数据绑定到视图。


我上面是将视图构造器添加到多个视图,通过将一组视图作为第一个参数传入 composer 方法,将一个视图合成器添加到多个视图:

// 使用基于类的 composer...
        View::composer(
            ['/front/index/app','front/notes/index','front/post/index'],
            'App\ViewComposers\SiteComposer'
        );



如果你查询的数据只在一个视图中显示:

// 使用基于类的 composer...
        View::composer(
            '/front/index/app','App\ViewComposers\SiteComposer'
        );

 

composer 方法同时也接受通配符 *,表示将一个视图合成器添加到所有视图:

// 使用基于类的 composer...
  View::composer(
    '*', 'App\ViewComposers\SiteComposer'
});