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 反射机制实现动态代理的代码
Oct 22 PHP
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
在php和MySql中计算时间差的方法
Apr 22 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
php查看当前Session的ID实例
Mar 16 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
Mar 18 PHP
PHP浮点数精度问题汇总
May 13 PHP
摘自织梦CMS的HTTP文件下载类
Aug 08 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 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
打造计数器DIY三步曲(下)
2006/10/09 PHP
PHP 网页过期时间的控制代码
2009/06/29 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
犀利的js 函数集合
2009/06/11 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
基于Django contrib Comments 评论模块(详解)
2017/12/08 Python
Python实现识别手写数字大纲
2018/01/29 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
骆驼官方商城:CAMEL
2016/11/22 全球购物
农业资源与环境专业自荐信范文
2013/12/30 职场文书
四川成都导游欢迎词
2014/01/18 职场文书
毕业实习计划书
2015/01/16 职场文书
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫
python实现手机推送 代码也就10行左右
2022/04/12 Python