详解Laravel视图间共享数据与视图Composer


Posted in PHP onAugust 04, 2016

1、在视图间共享数据

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

全局帮助函数viewresponse类似,如果传入参数,则返回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('sitename','Laravel学院');
  }

  /**
   * Register any application services.
   *
   * @return void
   */
  public function register()
  {
    //
  }
}

我们在routes.php中定义两个路由:

Route::get('testViewHello',function(){
  return view('hello');
});

Route::get('testViewHome',function(){
  return view('home');
});

然后在resources/views目录下创建一个home.blade.php视图文件,内容如下:

{{$sitename}}首页

再创建一个hello.blade.php视图文件:

欢迎来到{{$sitename}}!

在浏览器中分别访问http://laravel.app:8000/testViewHellohttp://laravel.app:8000/testViewHome,则都能解析出$sitename的值。

2、视图Composer

有时候我们想要在每次视图渲染时绑定一些特定数据到视图中,比如登录用户信息,这时候我们就要用到视图Composer,视图Composer通过视图工厂的composer方法实现。该方法的第二个回调参数支持基于控制器动作和闭包函数两种方式。

简单起见,我们还是基于AppServiceProvider,不去单独创建服务提供者,这里我们传递闭包参数(控制器动作参考视图文档):

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
  /**
   * Bootstrap any application services.
   *
   * @return void
   */
  public function boot()
  {
    //视图间共享数据
    view()->share('sitename','Laravel学院');

    //视图Composer
    view()->composer('hello',function($view){
      $view->with('user',array('name'=>'test','avatar'=>'/path/to/test.jpg'));
    });
  }

  /**
   * Register any application services.
   *
   * @return void
   */
  public function register()
  {
    //
  }
}

修改hello.blade.php视图文件:

欢迎来到{{$sitename}}!

<h3>用户信息</h3>
用户名:{{$user['name']}}<br>
用户头像:{{$user['avatar']}}

在浏览器中访问http://laravel.app:8000/testViewHello,输出内容如下:

欢迎来到Laravel学院!

用户信息

用户名:test
用户头像:/path/to/test.jpg

你也可以传递数据到多个视图:

view()->composer(['hello','home'],function($view){
  $view->with('user',array('name'=>'test','avatar'=>'/path/to/test.jpg'));
});

甚至所有视图(使用通配符*):

view()->composer('*',function($view){
  $view->with('user',array('name'=>'test','avatar'=>'/path/to/test.jpg'));
});

以上就是Laravel视图间共享数据及视图Composer的详细内容,希望本文对大家学习Laravel有所帮助。

PHP 相关文章推荐
PHP 中的一些经验积累
Oct 09 PHP
用php实现的下载css文件中的图片的代码
Feb 08 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
Jun 08 PHP
PHP页面实现定时跳转的方法
Oct 31 PHP
PHP采集静态页面并把页面css,img,js保存的方法
Dec 23 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 PHP
thinkphp下MySQL数据库读写分离代码剖析
Apr 18 PHP
php判断文件上传图片格式的实例详解
Sep 30 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
Nov 04 PHP
yii的入口文件index.php中为什么会有这两句
Aug 04 #PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 #PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 #PHP
浅析php如何实现App常用的秒发功能
Aug 03 #PHP
php微信开发之带参数二维码的使用
Aug 03 #PHP
PHP支付系统设计与典型案例分享
Aug 02 #PHP
php微信支付接口开发程序
Aug 02 #PHP
You might like
swfupload 多文件上传实现代码
2008/08/27 PHP
PHP安全技术之 实现php基本安全
2010/09/04 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
跟老齐学Python之复习if语句
2014/10/02 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
django框架两个使用模板实例
2019/12/11 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
活动志愿者自荐信
2014/01/27 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
弄虚作假心得体会
2014/09/10 职场文书
民主生活会发言材料
2014/10/20 职场文书
晚会开场白和结束语
2015/05/29 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
利用Python判断你的密码难度等级
2021/06/02 Python
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技