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 相关文章推荐
文件上传程序的全部源码
Oct 09 PHP
php 引用(&amp;)详解
Nov 20 PHP
php学习之 数组声明
Jun 09 PHP
CodeIgniter删除和设置Cookie的方法
Apr 07 PHP
CI分页类首页、尾页不显示的解决方法
Mar 28 PHP
PHP实现路由映射到指定控制器
Aug 13 PHP
PHP入门教程之数学运算技巧总结
Sep 11 PHP
php中引用符号(&amp;)的使用详细介绍
Dec 06 PHP
php-fpm开启状态统计的方法详解
Jun 23 PHP
Yii 2中的load()和save()示例详解
Aug 03 PHP
PHP设计模式之命令模式示例详解
Dec 20 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Mar 09 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
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
基本DOM节点操作
2017/01/17 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
python入门之基础语法学习笔记
2020/02/08 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
顶岗实习计划书
2014/01/10 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
团支部推优材料
2014/05/21 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
初中班干部工作总结
2015/08/10 职场文书
党组织结对共建协议书
2016/03/23 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
python图片灰度化处理的几种方法
2021/06/23 Python
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python