- Laravel默认使用Blade作为模板引擎,Blade中可使用原生PHP代码输出。
- Blade模板使用
.blade.php
作为文件扩展名。 - Blade模板最终都将被“编译”(正则替换)成原生PHP代码并缓存,除非模板文件被修改否则不会重新编译。
模板引擎需要完成最基本三项功能:
- 引入继承
- 变量输出
- 流程控制
模板引入
Blade提供@include
指令以便于在一个视图中引入另一个视图,所有父视图中变量均在被引入子视图中可用。可向被包含的视图传递额外数据。
@include('view.head', ['data'=>'list'])
模板继承
Blade提供模板继承和部件可使不同页面使用统一的布局,当定义子视图时,使用@extends
指令指定子视图需继承的父视图,使用@section
指令向布局的部件中注入内容。
指令 | 描述 |
---|---|
@section | 指令定义内部的部件 |
@yield | 指令为给定部件展示内容 |
@extends | 指令指定子视图所需继承的父视图 |
视图的布局通常都会拥有一个统一的模板,可建立统一的基础布局模板layout.blade.php
,让其他视图文件都来继承自它。
$ vim resources/view/layout.blade.php
<!doctype html>
<html lang="{{$setting['lang']}}">
<head>
<meta charset="{{$setting['charset']}}">
<title>@{{$title}}</title>
</head>
<body>
@yield('content')
</body>
</html>
$ vim resources/views/index.blade.php
@extends('layout')
@section('content')
<h1>index page</h1>
@stop
例如:使用带有侧边栏的布局
$ vim resources/view/layout.blade.php
<!doctype html>
<html lang="{{$setting['lang']}}">
<head>
<meta charset="{{$setting['charset']}}">
<title>@{{$title}}</title>
</head>
<body>
<div class="sidebar">
@section('sidebar')
<h3>控制面板</h3>
@show
</div>
<div class="content">
@yield('content')
</div>
</body>
</html>
$ vim resources/views/child.blade.php
@extends('layout')
@section('sidebar')
@parent
<ul>
<li>菜单条目</li>
<li>菜单条目</li>
<li>菜单条目</li>
</ul>
@endsection
@section('content')
<h1>demo page</h1>
@endsection
变量输出
-
{{{...}}}
用于转义输出 -
{{$name or 'defualt_value'}}
默认值输出 -
{{isset($name)?$name:''}}
三元条件判断
{{$var}}
之间是要输出的变量内容,此种方式会与某些JS框架发生冲突,例如在AngularJS中采用{{}}
进行数据绑定,因此可使用@{{ $var }}
语法告知Blade渲染引擎表达式保留原样。
在Blade中@
打头的都是指令,例如流程控制的输出@if...@ifend
。
默认使用{{$var}}
语法会自动传递给PHP的htmlentities()
来对变量进行HTML实体化处理以避免XSS攻击。使用{!! $var !!}
可避免htmlentities()
处理,进而原样输出。
流程控制
- 条件分支
- 循环分支
条件控制
- 使用
@if...@elseif...@else...@endif
指令创建条件分支表达式。 - 使用
@unless(bool)...@endunless
指令,表示除非条件满足则执行。
循环控制
- 使用
@for($i=0; $i<$length;$i++)...@endfor
- 使用
@foreach($list as $item)...@endforeach
- 使用
@forelse($list as $item)...@empty...@endforelse
- 使用
@while(true)...@endwhile
结束循环或跳出当前循环
@foreach ($list as $item)
@if ($item->status== 1)
@continue
@endif
<li>{{ $item->name }}</li>
@if ($item->count >= 100)
@break
@endif
@endforeach
把条件和指令声明放在同一行
@foreach ($list as $item)
@continue($item->status == 1)
<li>{{ $item->name }}</li>
@break($item->count >= 100)
@endforeach
循环变量$loop
的属性对于循环控制提供了很好的帮助。
@foreach ($list as $item)
@if ($loop->first)
迭代第一条
@endif
@if ($loop->last)
迭代最后一条
@endif
<p>{{ $item->name }}</p>
@endforeach
循环迭代 | 描述 |
---|---|
$loop->index | 以索引值0开始当前循环迭代的位置下标 |
$loop->iteration | 当前循环迭代从1开始 |
$loop->remaining | 循环中剩余的迭代 |
$loop->count | 数组中要迭代的条目总数 |
$loop->first | 是否为循环中第一次迭代 |
$loop->last | 是否为循环中最后一次迭代 |
$loop->depth | 当前循环嵌套的层级 |
$loop->parent | 嵌套循环中父级循环的$loop 变量 |
生成URL
- 使用
url()
辅助函数生成路由
{{url('admin/login')}}
url()
辅助函数的Facade外观方法为URL::to()
方法
{{URL::to('admin/login')}}
- 若注册路由时指定别名可通过
route()
辅助函数以路由别名为参数生成URL
在路由中注册时使用别名
$ vim route/web.php
Route::prefix('admin')->group(function() {
Route::get('/login', 'LoginController@index')->name("login");
Route::post('/login/signin', 'LoginController@signin')->name("signin");
Route::get('/', 'HomeController@index')->name("home");
});
在模板引擎中使用路由别名生成URL
<form class="m-t" role="form" method="post" action="{{route('signin')}}">
</form>
route()
辅助函数的Facade外观方法为URL::route()
<form class="m-t" role="form" method="post" action="{{URL::route('signin')}}">
</form>
- 若注册路由时没有指定别名可使用
action()
辅助函数以控制器与方法作为参数生成URL
{{action('UserController@index', ['id'=>1])}}
辅助函数action()
的Facade外观方法为URL::action()
方法
{{URL::action('UserController@index', ['id'=>1])}}