Laravel5.5 视图 - 创建视图和数据传递示例


Posted in PHP onOctober 21, 2019

创建视图

视图包含应用的 HTML 代码,并将应用的控制器逻辑和表现逻辑进行分离。视图文件存放在 resources/views 目录中。下面是一个简单的视图示例:

<!-- resources/views/greeting.blade.php 视图文件 -->
 
<html>
  <body>
    <h1>Hello, {{ $name }}</h1>
  </body>
</html>

可以通过辅助函数 view ,返回这个视图响应:

Route::get('/', function () {
  return view('greeting', ['name' => 'jack']);
});

view 方法的第一个参数是 resources/views 目录下相应的视图文件的名称,第二个参数是一个数组,表示传递给视图文件的数据。

在这个例子中,我们传递了一个 name 变量,在视图中通过使用 Blade 语法将其显示出来。

当然,视图还可以存放在 resources/views 的子目录中,用“.”号来引用子目录中的视图。

例如,如果视图存放路径是 resources/views/admin/profile.blade.php,那么我们可以这样引用它:

return view('admin.profile', $data);

判断视图是否存在

如果需要判断视图是否存在,可调用 View 门面上的 exists 方法,如果视图存在则返回 true:

use Illuminate\Support\Facades\View;
 
if (View::exists('emails.customer')) {
  //
}

创建第一个有效视图

调用 View 门面上的 first 方法,可以用于创建给定视图数组中的第一个存在的视图:

use Illuminate\Support\Facades\View;
 
return View::first(['custom.admin', 'admin'], $data);

这个功能在应用或扩展包允许视图被自定义或覆盖时很有用。

传递数据到视图

可以简单通过数组方式将数据传递到视图:

return view('greeting', ['name' => 'jack']);

除此之外,还可以通过 with 方法传递独立的数据片段到视图:

$view = view('greeting')->with('name', 'jack');

在视图间共享数据

有时候,我们需要在所有视图之间共享数据片段,这时可以使用视图门面的 share 方法,通常,需要在某个服务提供者的 boot 方法中调用 share 方法,你可以将其添加到 AppServiceProvider 或生成独立的服务提供者来存放这段代码逻辑:

<?php
 
namespace App\Providers;
 
use View;
 
class AppServiceProvider extends ServiceProvider
{
  /**
   * 启动所有应用服务
   *
   * @return void
   */
  public function boot()
  {
    View::share('key', 'value');
  }
 
  /**
   * 注册服务提供者
   *
   * @return void
   */
  public function register()
  {
    //
  }
}

视图 Composer

视图 Composer 是当视图被渲染时的回调函数或类方法。

如果你有一些数据需要在视图每次渲染时都做绑定,可以使用视图 Composer 将逻辑组织到一个单独的地方。

在本例中,首先要在某个服务提供者中注册视图 Composer,我们将会使用 View 门面来访问 Illuminate\Contracts\View\Factory 的底层实现,记住,Laravel 不会包含默认的视图 Composer 目录,我们可以按照自己的喜好组织其路径,例如可以创建一个 app/Http/ViewComposers 目录:

<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
 
class ComposerServiceProvider extends ServiceProvider
{
  /**
   * 在容器中注册绑定.
   *
   * @return void
   */
  public function boot()
  {
    // 使用基于类方法的 composers...
    View::composer(
      'profile', 'App\Http\ViewComposers\ProfileComposer'
    );
 
    // 使用基于回调函数的 composers...
    View::composer('dashboard', function ($view) {});
  }
 
  /**
   * 注册服务提供者.
   *
   * @return void
   */
  public function register()
  {
    //
  }
}

注:如果创建一个新的服务提供者来包含视图 Composer 注册,需要添加该服务提供者到配置文件 config/app.php 的 providers 数组中。

现在我们已经注册了视图 Composer,每次 profile 视图被渲染时都会执行 ProfileComposer@compose 方法,接下来我们来定义该 Composer 类:

<?php
 
namespace App\Http\ViewComposers;
 
use Illuminate\View\View;
use Illuminate\Repositories\UserRepository;
 
class ProfileComposer
{
  /**
   * 用户仓库实现.
   *
   * @var UserRepository
   */
  protected $users;
 
  /**
   * 创建一个新的属性composer.
   *
   * @param UserRepository $users
   * @return void
   */
  public function __construct(UserRepository $users)
  {
    // 依赖注入通过服务容器自动解析...
    $this->users = $users;
  }
 
  /**
   * 绑定数据到视图.
   *
   * @param View $view
   * @return void
   */
  public function compose(View $view)
  {
    $view->with('count', $this->users->count());
  }
}

视图被渲染前,Composer 类的 compose 方法被调用,同时 Illuminate\View\View 实例被注入该方法,从而可以使用其 with 方法来绑定数据到视图。

注:所有视图 Composer 都通过服务容器被解析,所以你可以在 Composer 类的构造函数中声明任何你需要的依赖。

添加 Composer 到多个视图

你可以传递视图数组作为 composer 方法的第一个参数来一次性将视图 Composer 添加到多个视图:

View::composer(
  ['profile', 'dashboard'],
  'App\Http\ViewComposers\MyViewComposer'
);
composer 方法还支持 * 通配符,允许将一个 Composer 添加到所有视图:

View::composer('*', function ($view) {
  //
});

视图创建器

视图创建器和视图 Composer 非常类似,不同之处在于前者在视图实例化之后立即失效而不是等到视图即将渲染。

使用 View 门面的 creator 方法即可注册一个视图创建器:

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');

以上这篇Laravel5.5 视图 - 创建视图和数据传递示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
十天学会php之第三天
Oct 09 PHP
Look And Say 序列php实现代码
May 22 PHP
php class中self,parent,this的区别以及实例介绍
Apr 24 PHP
测试php函数的方法
Nov 13 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 PHP
PHP书写格式详解(必看)
May 23 PHP
PHP使用自定义方法实现数组合并示例
Jul 07 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
如何直接访问php实例对象中的private属性详解
Oct 12 PHP
laravel orm 关联条件查询代码
Oct 21 #PHP
浅谈laravel orm 中的一对多关系 hasMany
Oct 21 #PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
Oct 21 #PHP
Laravel ORM 数据model操作教程
Oct 21 #PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
Oct 21 #PHP
laravel 解决多库下的DB::transaction()事务失效问题
Oct 21 #PHP
PHP常用函数之获取汉字首字母功能示例
Oct 21 #PHP
You might like
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
精通php的十大要点(上)
2009/02/04 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
Ext 今日学习总结
2010/09/19 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
js canvas仿支付宝芝麻信用分仪表盘
2016/11/16 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
2020/06/11 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
Django values()和value_list()的使用
2020/03/31 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
两则小学生的自我评价分享
2013/11/14 职场文书
自我评价怎么写好呢?
2013/12/05 职场文书
英语生日邀请函
2014/01/23 职场文书
《狼和小羊》教学反思
2014/04/20 职场文书
班风学风建设方案
2014/05/06 职场文书
计算机求职信
2014/07/02 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
2014年财政所工作总结
2014/11/22 职场文书
幼儿园感谢信
2015/01/21 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
python实现socket简单通信的示例代码
2021/04/13 Python