详解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 相关文章推荐
桌面中心(二)数据库写入
Oct 09 PHP
php MYSQL 数据备份类
Jun 19 PHP
PHP 变量定义和变量替换的方法
Jul 30 PHP
基于OpenCV的PHP图像人脸识别技术
Oct 11 PHP
php操作csv文件代码实例汇总
Sep 22 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
php实现计数器方法小结
Jan 05 PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
Feb 28 PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 PHP
thinkPHP5使用Rabc实现权限管理
Aug 28 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
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
node.js超时timeout详解
2014/11/26 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
老生常谈angularjs中的$state.go
2017/04/24 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
python 实现删除文件或文件夹实例详解
2016/12/04 Python
Python反转序列的方法实例分析
2018/03/21 Python
Python GUI编程完整示例
2019/04/04 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
基于python实现操作git过程代码解析
2020/07/27 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
高一化学教学反思
2014/02/05 职场文书
高中生物教学反思
2014/02/05 职场文书
创建文明学校实施方案
2014/03/11 职场文书
爱心捐款倡议书
2014/04/14 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
公司周年庆典致辞
2015/07/30 职场文书