Laravel5.4框架中视图共享数据的方法详解


Posted in PHP onSeptember 05, 2019

本文实例讲述了Laravel5.4框架中视图共享数据的方法。分享给大家供大家参考,具体如下:

每个人都会遇到这种情况:某些数据还在每个页面进行使用,比如用户信息,或者菜单数据,最基本的做法是在每个视图空控制器中传入这些数据,但显然并不是我们想要的结果。另一种方法就是使用视图数据共享,视图数据共享的基本使用很简单,可查看视图文档了解详情,这里我们演示两个使用示例:在视图间共享数据和视图Composer

在视图中共享数据

除了在单个视图中传递指定数据之外,有时候需要在所有视图中传入同一数据,即我们需要在不同视图中共享数据。要实现这一目的,需要使用视图工厂的share方法。

全局帮助函数view和response类似,如果传入参数,则返回Illuminate\View\View实例,不传入参数则返回Illuminate\View\Factory实例。所以我们可以通过在服务提供者的boot方法中使用如下方式实现视图间共享数据:

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
  /**
   * Bootstrap any application services.
   *
   * @return void
   */
  public function boot()
  {
    //视图间共享数据
    view()->share('name','高伟');
  }
  /**
   * Register any application services.
   *
   * @return void
   */
  public function register()
  {
    //
  }
}

接下来我直接用一个空的Laravel项目做演示,我们在 routes 文件首页(welcome.blade.php)视图:

Route::get('/', function () {
  return view('welcome');
});

然后在视图中输出视图共享数据:

<!DOCTYPE html>
<html>
  <head>
    <title>Laravel</title>
    <style>
      html, body {
        height: 100%;
      }
      body {
        margin: 0;
        padding: 0;
        width: 100%;
        display: table;
        font-weight: 100;
        font-family: 'Lato';
      }
      .container {
        text-align: center;
        display: table-cell;
        vertical-align: middle;
      }
      .content {
        text-align: center;
        display: inline-block;
      }
      .title {
        font-size: 96px;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="content">
        <div class="title">Laravel 5</div>
        <h1>hello,{{$name}}</h1>
      </div>
    </div>
  </body>
</html>

视图Composer

上面的一种做法虽然可行,但是在别人下载项目后,共享数据是从数据库中获取的,执行数据迁移的时候会报错。这时候我们就要用到视图Composer,视图Composer通过视图工厂的composer方法实现。该方法的第二个回调参数支持基于控制器动作和闭包函数两种方式。

控制器的动作方式

首先要在服务提供者中注册视图 Composer,我们将会使用辅助函数 view 来访问 Illuminate\Contracts\View\Factory 的底层实现,记住,Laravel 不会包含默认的视图 Composer 目录,我们可以按照自己的喜好组织其路径,例如可以创建一个 App\Http\ViewComposers 目录:

<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
/**
* 基于类的实现方式
*/
class MottoComposer
{
  /**
   * 共享数据
   * @date  2018-01-13
   * @author 高伟
   * @param View    $view [description]
   * @return [type]      [description]
   */
  public function compose(View $view)
  {
    $view->with('motto', '嘎嘎嘎,我一直在努力!');
  }
}

然后我们在 AppServiceProvider 中继续添加共享数据:

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
  /**
   * Bootstrap any application services.
   *
   * @return void
   */
  public function boot()
  {
    view()->share('name','高伟');
    // 使用基于类的composers...第一个参数可以指定共享给那个视图,多个视图用数组,共享到全部视图可以用 *
    view()->composer(
      'welcome', 'App\Http\ViewComposers\MottoComposer'
    );
  }
  /**
   * Register any application services.
   *
   * @return void
   */
  public function register()
  {
    //
  }
}

在视图中显示共享数据:

...
<div class="content">
 <div class="title">Laravel 5</div>
 <h1>hello,{{$name}}</h1>
 <p>{{$motto}}</p>
</div>
...

闭包实现方式

闭包的实现方式相对来说简单很多,这里就简单贴书代码:

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
  /**
   * Bootstrap any application services.
   *
   * @return void
   */
  public function boot()
  {
    view()->share('name','高伟');
    // 使用基于类的composers...
    view()->composer(
      'welcome', 'App\Http\ViewComposers\MottoComposer'
    );
    // 闭包实现方式
    view()->composer('*',function($view)
    {
      $view->with('info','http://www.iwanli.me');
    });
  }
  /**
   * Register any application services.
   *
   * @return void
   */
  public function register()
  {
    //
  }
}

视图中显示数据:

...
<div class="content">
 <div class="title">Laravel 5</div>
 <h1>hello,{{$name}}</h1>
 <p>{{$motto}}</p>
 <p>{{$info}}</p>
</div>
...

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
php中判断文件存在是用file_exists还是is_file的整理
Sep 12 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
PHP中常用的转义函数
Feb 28 PHP
PHP获取数组最大值下标的方法
May 12 PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 PHP
Yii2框架BootStrap样式的深入理解
Nov 07 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
Oct 24 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
laravel框架上传图片实现实时预览功能
Oct 14 PHP
Laravel相关的一些故障解决
Aug 19 PHP
php生成微信红包数组的方法
Sep 05 #PHP
Laravel框架创建路由的方法详解
Sep 04 #PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 #PHP
Yii框架操作cookie与session的方法实例详解
Sep 04 #PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
Sep 04 #PHP
Yii框架响应组件用法实例分析
Sep 04 #PHP
PHP命名空间用法实例分析
Sep 04 #PHP
You might like
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
php递归创建目录的方法
2015/02/02 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
深入理解Javascript中的this关键字
2015/03/27 Python
Python字符串详细介绍
2015/05/09 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
python中数字是否为可变类型
2020/07/08 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
医药专业推荐信
2013/11/15 职场文书
低碳生活倡议书
2014/04/14 职场文书
综治宣传月活动总结
2014/04/28 职场文书
离婚协议书范本2014
2014/10/27 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
python not运算符的实例用法
2021/06/30 Python
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
Nginx报404错误的详细解决方法
2022/07/23 Servers