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记录日志的实现代码
Aug 08 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
关于php正则匹配汉字的方法介绍
Apr 25 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
php读取csv文件并输出的方法
Mar 14 PHP
php实现微信公众号无限群发
Oct 11 PHP
配置Nginx+PHP的正确思路与过程
May 10 PHP
微信支付开发订单查询实例
Jul 12 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
Yii2.0建立公共方法简单示例
Jan 29 PHP
详解使用php-cs-fixer格式化代码
Sep 16 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
初探PHP5
2006/10/09 PHP
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
JQery 渐变图片导航效果代码 漂亮
2010/01/01 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
django的ORM操作 增加和查询
2019/07/26 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
Python 里最强的地图绘制神器
2021/03/01 Python
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
个人找工作自荐信格式
2013/09/21 职场文书
员工拾金不昧表扬信
2014/01/09 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
员工工作及收入证明
2014/10/28 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers