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 相关文章推荐
一个基于PDO的数据库操作类
Mar 24 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
php三维数组去重(示例代码)
Nov 26 PHP
教你php如何实现验证码
Jan 20 PHP
win7安装php框架Yii的方法
Jan 25 PHP
php session实现多级目录存放实现代码
Feb 03 PHP
详解PHP中websocket的使用方法
Sep 15 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
详解php用curl调用接口方法,get和post两种方式
Jan 13 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 PHP
WordPress伪静态规则设置代码实例
Dec 10 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
如何删除多级目录
2006/10/09 PHP
php split汉字
2009/06/05 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
浅谈JS验证表单文本域输入空格的问题
2017/02/14 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
西班牙在线药店:DosFarma
2020/03/28 全球购物
求职简历的自我评价怎样写好
2013/10/07 职场文书
销售自荐信
2013/10/22 职场文书
生产总经理岗位职责
2013/12/19 职场文书
中国入世承诺
2014/04/01 职场文书
安全保证书范文
2014/04/29 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书
Oracle笔记
2021/04/05 Oracle
pandas 实现将NaN转换为None
2021/05/14 Python
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers