Laravel 中的视图共享数据

简介

  • 为了增强解视图代码的可维护性,我们除了要了解视图最基础的使用方式,还要对视图的共享数据方式做深入的了解,本文将介绍Laravel视图数据共享的常用方法。

通过 ServiceProvider “注册服务提供者”共享view数据

  • 通过ServiceProvider 来完成视图数据的共享是一种比较常用的方式之一。

  • 用到 Illuminate\Support\Facades\View::share('key', 'value');

  • 接下来做一个完整的举例,首先生成一个 ServiceProvider 通过 php artisan make:provider TestShareViewProvider 命令创建一个Provider 的模板。

    输入图片说明

  • 打开app/Providers/TestShareViewProvider.php 我们只是修改boot() 方法即可,因为,此方法在所有其他服务提供器都注册之后才会调用,这就意味着你可以调用其他注册的服务,这是一个好习惯尽可能不要在register 放置调用其他 Provider的功能。

<?php

namespace App\Providers;

// 这个要引入,否则View 无法使用
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class TestShareViewProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        // 通过这种方法就可以很简答的共享数据。
        View::share("sitename", "Laravel - PHP");
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

  • 接下来把这个 ServiceProvider (服务提供者) 加入到 config/app.php
# 找到 `providers` 配置段落,添加刚才我们创建的服务提供者。
App\Providers\TestShareViewProvider::class

  • 接下来建立一个视图文件 resources/views/test-share.blade.php
<h1>
    {{$site_name}}
</h1>

  • 简单的测试一下,在 /routes/web.php 添加一个路由
/**
 * 创建一个测试用的路由,加载页面如果正常显示共享的 sitename 那么就表示成功
*/
Route::get('/test/shareview', function() {
    return view("test-share", []);
});

  • 如果没有配置http服务器,测试的时候可以启动测试服务 $ php artisan serve

    输入图片说明

  • 访问 http://localhost:8000/test/shareview locahost:7003 是我本机的测试地址。

    image.png

ServiceProvider 共享数据的改进

  • 上面的方法,不适用太复杂的逻辑,会导致 Provider类的过于庞大。

  • 这就用到 View::composer(“viewname”, “DoClass”) 这个方法,通过这个方法可以指定到底是哪个视图可以应用到哪个类,其中,DoClass 必须具有 compose(View $view) 方法用于接收调用注入。

  • 为了测试上面的内容,我们在 app/Http/Views/Composers/下面创建一个 CLeftBarComposer.php 代码如下:

<?php

namespace App\Http\Views\Composers;

use Illuminate\View\View;

class CLeftBarComposer {
    /**
     * 必须要实现的方法,会接收View::composer 方法的注入
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('leftmsg', "This's left msg.");
    }
}

  • 建立好后修改 app/Providers/TestShareViewProvider.php 的内容:
class TestShareViewProvider extends ServiceProvider
{
    /**
     * 修改这个方法里里面的内容,新增 composer 解析
     * @return void
     */
    public function boot()
    {
        View::share("sitename", "Laravel - PHP");
        View::composer("test-share", "App\Http\Views\Composers\CLeftBarComposer");
    }

    /**
     * ....
     */
    public function register()
    {
        //
    }
}

  • 最后简单修改一下 resources/views/test-share.blade.php
<h1>
    {{$leftmsg}}
    {{$sitename}}
</h1>

输入图片说明
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.在网上看了几篇关于laravel下面进行共享数据的方法,感觉讲的不是很容易让人理解,所以亲自整理一下,给需要的...
    Mr丘山阅读 738评论 0 0
  • Laravel 学习交流 QQ 群:375462817 本文档前言Laravel 文档写的很好,只是新手看起来会有...
    Leonzai阅读 8,103评论 2 12
  • 视图组件建立完成之后,可以在组件内部写公共的组件可用变量,方便多个地方使用 如果想把数据共享给所有视图,只要在服务...
    977dddfdc689阅读 1,316评论 0 1
  • 网站中,许多页面的侧边栏是相同的。例如: 分类列表页,与文章详情页的侧边栏都包含 最新文章 最新评论 统计计数 这...
    豆豆_06fa阅读 2,120评论 0 0
  • Laravel框架一:原理机制篇 Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特...
    Mr_Z_Heng阅读 3,752评论 0 13