Laravel中的Blade模板引擎示例详解


Posted in PHP onOctober 10, 2017

前言

本文主要给大家介绍了关于Laravel中Blade模板引擎的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧。

Blade 模板引擎

Blade 是 laravel 提供的一个简单强大的模板引擎,它是把 Blade 视图编译成原生的 PHP 代码并缓存起来。缓存会在 Blade 视图改变时而改变,这意味着 Blade 并没有给你的应用添加编译的负担。Blade 视图文件使用 .blade.php 后缀,一般都存储在 resources/views 目录下。

模板继承

先来看个例子

<!-- Stored in resources/views/layouts/master.blade.php-->
<html>
 <head>
 <title>App Name - @yield('title')</title>
 </head>
 <body>
 @section('sidebar')
  This is the master sidebar.
 @show
 
 <div class="container">
  @yield('content')
 </div>
 </body>
</html>

Blade 模板文件包含了典型的 HTML 标记。你肯定看到了 @section 和 @yield 指令。@section 指令就如它的名字所暗示的那样定义了一个内容区块,而 @yield 指令是用来显示所提供的挂件区块所包含的内容。我们已经定义好了一个基本的布局,接下来我们可以使用 Blade 的 @extends 指令来明确的指定继承这个布局。然后使用 @section 指令将挂件中的内容挂载到布局中,在上面的例子中,挂件的内容将被挂载到布局中的 @yield 部分:

<!-- Stored in resoures/views/child.blade.php -->
@extends('layouts.master')
 
@section('title', 'Page Title')
 
@section('sidebar')
 @parent
 
 <p>This is appended to the master sidebar.</p>
@endsection
 
@section('content')
 <p>This is my body content.</p>
@endsection

在上面的例子作用 sidebar 挂件利用 @parent 指令来追加布局中的 sidebar 部分的内容,如果不使用则会覆盖掉布局中的这部分。@parent 指令会在视图被渲染时替换为布局中的内容。

Blade 视图可以像原生 PHP 视图一样使用全局帮助函数 view 来返回渲染后的内容:

Route::get('blade', function () {
 return view('child');
});

显示数据

你可以使用花括号 { 来在视图中显示传递到视图中的变量,例如,你定义了下面的路由:

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

你可以在视图中这样来输出 name 变量的内容:

Hello, {{ $name }}

当然,你也可以从原生 PHP 方法中返回内容。事实上,你可以在 Blade echo 声明中使用任意的 PHP 代码:(Blade {{}} 声明中的内容是自动通过 htmlentities 方法过滤的,用来防止 XSS 攻击。)

The current UNIX timestamp is {{ time() }}

由于很多 JavaScript 框架都使用花括号来表明所提供的表达式应该被显示在浏览器中。所以你可以使用 @ 符号来告诉 Blade 渲染引擎你需要这个表达式原样保留:

Hello, @{{ name }}

我们常用三目运算符来赋值

{{ isset($name) ? $name : 'Default' }}

Blade 提供了一个便捷的方式来替换这个三元声明:

{{ $name or 'Default' }}

默认Blade {{}} 声明会自动的使用 htmlentities 方法来避免 XSS 攻击。如果你不想你的数据被转义,你可以使用下面的语法,但是要注意,小心被攻击:

Hello, {!! $name !!}

控制结构

你可以通过 @if,@elseif,@else和 @endif 指令来使用 if 控制结构 :

@if (count($records) === 1)
 I have one record!
@elseif (count($records) > 1)
 I have multiple records!
@else
 I don't have any records!
@endif

当然为了方便,Blade 也提供了替代指令 @unless 指令:

@unless (Auth::check())
 You are not signed in.
@endunless

也可以使用 @hasSection 指令来判断提供给布局的挂件是否包含了内容:

<title>
 @hasSection('title')
 @yield('title') - App Name
 @else
 App Name
 @endif
</title>

说到控制少不了循环结构,类似PHP的:

@for ($i = 0; $i < 10; $i++)
 The current value is {{ $i }}
@endfor
 
@foreach ($users as $user)
 <p>This is user {{ $user->id }}</p>
@endforeach
 
@forelse ($users as $user)
 <li>{{ $user->name }}</li>
@empty
 <p>No users</p>
@endforelse
 
@while (true)
 <p>I'm looping forever.</p>
@endwhile

Blade 也提供了终止迭代或取消当前迭代的指令:

@foreach ($users as $user)
 @if($user->type == 1)
 @continue
 @endif
 
 <li>{{ $user->name }}</li>
 
 @if($user->number == 5)
 @break
 @endif
@endforeach

你也可以使用指令声明包含条件的方式来达到中断:

@foreach ($users as $user)
 @continue($user->type == 1)
 
 <li>{{ $user->name }}</li>
 
 @break($user->number == 5)
@endforeach

包含子视图

可以使用 @include 指令来包含一个视图的内容,当前视图中的变量也会被共享给子视图:

<div>
 @include('shared.errors')
 
 <form>
 <!-- Form Contents -->
 </form>
</div>

尽管子视图会自动继承父视图中的所有数据变量,你也可以直接传递一个数组变量来添加额外的变量到子视图(在 Blade 视图中避免使用 __DIR__ 和 __FILE__ 常量,因为它们会解析为视图缓存所在的位置):

@include('view.name', ['some' => 'data'])

你可以使用 Blade 的 @each 指令来在一行中合并引入多个视图:

@each('view.name', $jobs, 'job')

第一个参数是数组或集合中每个元素需要被渲染的视图名称。

第二个参数是一个数组或集合,被用来提供迭代。

第三个参数是要分配给当前视图的变量名。

你也可以传递第四个参数到 @each 指令。如果所提供的数组是空数组的话,该参数所提供的视图将会被引入。

@each('view.name', $jobs, 'job', 'view.empty')

Blade 中的注释,这样写不会被渲染:

{{-- This comment will not be present in the rendered HTML --}}

Blade 允许你在已命名的堆中压入内容:

@push('scripts')
 <script src="/example.js"></script>
@endpush

你可以在你需要的时候压入相同的堆任意的次数,你需要在布局中使用 @stack 来渲染堆:

<head>
 <!-- Head Contents -->
 @stack('scripts')
</head>

可以使用 @inject 指令来从服务容器中取回服务:

@inject('metrics', 'App\Services\MetricsService')
<div>
 Monthly Revenue: {{ $metrice->monthlyRevenue() }}
</div>

第一个参数将作为所取回服务存放的变量名,

第二个参数是你想要在服务容器中取回的类或接口名称。

可以使用 directvie 方法来注册指令。当 Blade 编译器遇到该指令时,它会自动的调用该指令注册时提供的回调函数并传递它的参数。

下面的例子创建了 @datetime($val) 指令来格式化 $val:

<?php
namespace App\Providers;
 
use Blade;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider{
 /**
 * Perform post-registration booting of services.
 *
 * @return void
 */
 public function boot(){
  Blade::directive('datetime', function ($expression) {
  return "<?php echo with{$express}->format('m/d/Y H:i'); ?>";
  });
 }
 
 /**
 * Register bindings in the container
 *
 * @return void
 */
 public function register() {
  //
 }
}

上面的例子中使用了 Laravel 的 with 帮助方法,它只是简单的返回一个所提供的对象或值,并提供方便的链式调用。最终该指令生成的 PHP 代码如下:

<?php echo with($var)->format('m/d/Y H:i'); ?>

在你更新 Blade 指令的逻辑之后,你应该删除所有已缓存的 Blade 视图,你可以使用 view:clear Artisan 命令来清除。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php htmlspecialchars加强版
Feb 16 PHP
PHP5中使用DOM控制XML实现代码
May 07 PHP
PHP 获取MySQL数据库里所有表的实现代码
Jul 13 PHP
php中检查文件或目录是否存在的代码小结
Oct 22 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
php循环table实现一行两列显示的方法
Jun 04 PHP
PHP实现的简单网络硬盘
Jul 29 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
轻松掌握php设计模式之访问者模式
Sep 23 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 PHP
Yii框架常见缓存应用实例小结
Sep 09 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 PHP
PHP小白必须要知道的php基础知识(超实用)
Oct 10 #PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
Oct 10 #PHP
PHP使用Redis实现防止大并发下二次写入的方法
Oct 09 #PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 #PHP
PHP完全二叉树定义与实现方法示例
Oct 09 #PHP
PHP实现的折半查询算法示例
Oct 09 #PHP
PHP实现的MD5结合RSA签名算法实例
Oct 07 #PHP
You might like
php学习笔记 数组遍历实现代码
2011/06/09 PHP
PHP自定义大小验证码的方法详解
2013/06/07 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
php文件下载处理方法分析
2015/04/22 PHP
PHP实现递归的三种方法
2020/07/04 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
js算法中的排序、数组去重详细概述
2013/10/14 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
python函数形参用法实例分析
2015/08/04 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
python放大图片和画方格实现算法
2018/03/30 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
Python有参函数使用代码实例
2020/01/06 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
python实现简单井字棋小游戏
2020/03/05 Python
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
舞蹈教师自荐信
2014/01/27 职场文书
2014年统战工作总结
2014/12/09 职场文书
商业计划书格式、范文
2019/03/21 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python