在laravel框架中提供了的一个模板引擎,它就是Blade。
Blade 并不限制你在视图(view)中使用原生 PHP 代码。所有 Blade 视图页面都将被编译成原生 PHP 代码并缓存起来,除非你的模板文件被修改了,否则不会重新编译,这就意味着 Blade 基本上不会给你的应用增加任何额外负担。Blade 视图文件使用 .blade.php
文件扩展名,并且一般被存放在 resourcesviews
目录。
模板的继承
我们先在resourcesviews目录下创建一个app.blade.php文件写一些HTML
:
<!DOCTYPE html> <html> <head> <title>Alex DK</title> </head> <body> <div class="container"> @yield('content') </div> </body> </html>
这是一个主模板,我们可以继承它 @yield关键字代表一个可插入的内容,我们在写一个home.blade.php就会明白这其中的关系:
@extends('app') @section('content') <h1>这是我们的第一个模板页面</h1> @stop
@extends关键字代表我们将继承一个模板,这样省去了很多重复代码编写的麻烦~,上面我们在app.blade.php中声明了一个@yield 可插入内容块儿,这样我们就可以在home.blade.php中使用@section关键字来插入内容了,@section对应着@stop。
为了检验结果 我们注册一个路由来看看:
Route::get('/home', function (){ return view('home'); });
展示数据
让我们先编写一个路由:
Route::get('/home', function (){ // 如果要向页面传递变量 只需要多添加一个数组参数就可以。注意:我们要渲染的blade不需要写home.blade.php 只需要写home就行了 不用写后面的后缀。 return view('home',['name'=>'DK']); });
对应的,我们修改home.blade.php:
@extends('app') @section('content') <h1>Hi {{ $name }}</h1> @stop
注意: Blade 中的 {{ }}
表达式的返回值将被自动传递给 PHP 的 htmlentities
函数进行处理,以防止 XSS 攻击。
很多JavaScript框架也使用花括号来解析一些东西,为了解决冲突可以使用'@{{}}'。
{{ }}不止可以输出传递过来的变量,还可以这样:{{ time() }} 输出PHP函数的返回值。
如果没有传递变量怎么办?
当我们解析一个不存在的变量就会报错,那么怎么办呢,你可以这样写:
{{ isset($name) ? $name : 'Default' }}
但是这样写太繁琐了,你可以在Blade中这样写,简单明了:
{{ $name or 'Alex' }}
注意:如果你想输出的数据不想被解析,可以使用{!! $any !!}
if表达式
我们可以使用一些关键字来实现流程控制:
- @if
- @else
- @elseif
- @endif
Route::get('/home/{score}', function ($score){ return view('home',compact('score')); });
@extends('app') @section('content') @if($score>=85) <p>你的数学成绩是优秀</p> @elseif($score>=60 && $score<85) <p>你的数学成绩是良好</p> @else <p>你的数学成绩没有及格</p> @endif @stop
循环
Blade有这几种循环:
- @for @endfor : 写法和PHP中一样
- @foreach @endforeach : 最常用
- @forelse @empty @endforelse : 如果循环到空值是 进入@empty块
- @while @endwhile : while循环
@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
包含子视图
你可以使用 @include
指令来包含一个视图的内容,当前视图中的变量也会被共享给子视图:
<div> @include('shared.errors') <form> <!-- Form Contents --> </form> </div>
尽管子视图会自动继承父视图中的所有数据变量,你也可以直接传递一个数组变量来添加额外的变量到子视图:
@include('view.name', ['some' => 'data'])