详解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下intval()和(int)转换使用与区别
Jul 18 PHP
让PHP开发者事半功倍的十大技巧小结
Apr 20 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
PHP的博客ping服务代码
Feb 04 PHP
php添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
May 15 PHP
php封装的smartyBC类完整实例
Oct 19 PHP
php正则修正符用法实例详解
Dec 29 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 PHP
Mac下快速搭建PHP开发环境步骤详解
May 05 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
js禁止表单重复提交
2017/08/29 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
在类Unix系统上开始Python3编程入门
2015/08/20 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
pytorch之添加BN的实现
2020/01/06 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
python语言是免费还是收费的?
2020/06/15 Python
Python如何绘制日历图和热力图
2020/08/07 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
工程预算与管理应届生求职信
2013/10/06 职场文书
外国人聘用意向书
2014/04/01 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
单位考核鉴定意见
2015/06/05 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书