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 相关文章推荐
用Zend Encode编写开发PHP程序
Oct 09 PHP
php开启安全模式后禁用的函数集合
Jun 26 PHP
php中hashtable实现示例分享
Feb 13 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
php实现汉字验证码和算式验证码的方法
Mar 07 PHP
php判断访问IP的方法
Jun 19 PHP
PHP实现原比例生成缩略图的方法
Feb 03 PHP
php使用自定义函数实现汉字分割替换功能示例
Jan 30 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
Apr 02 PHP
PHP7匿名类的用法示例
Apr 05 PHP
PHP与Web页面的交互示例详解一
Aug 04 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图片的二进制转换实现方法
2014/12/15 PHP
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
js读取cookie方法总结
2014/10/31 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
美国网上订购鲜花:FTD
2016/09/23 全球购物
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
struct与class的区别
2014/02/03 面试题
数学专业毕业生自荐信
2013/11/10 职场文书
会计助理岗位职责
2014/02/17 职场文书
土木工程专业推荐信
2014/02/19 职场文书
房屋租赁意向书
2014/04/01 职场文书
中学生学雷锋演讲稿
2014/04/26 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
售后客服工作职责
2014/06/16 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
Go Plugins插件的实现方式
2021/08/07 Golang
Python OpenCV之常用滤波器使用详解
2022/04/07 Python
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python