果需要判断视图是否存在,可调用 View 门面上的 exists 方法,如果视图在磁盘存在则返回 true
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
使用视图上的 first 方法可以返回数组中存在的视图的第一个视图,这在你的应用或扩展包允许自定义或覆盖视图时很有用:
// 若存在custom.admin视图则使用custom.admin视图,否则使用存在的admin视图
return view()->first(['custom.admin', 'admin'], $data);
//当然,也可以调用 View 门面上的 first 方法来创建:
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
$name="jojo";
$age=12;
return view('greetings', compact('name','age'));
return view('greetings', compact(['name','age']));
return view('greetings', ['name' => 'jojo','age'=>12]);
return view('greeting')->with(['name' => 'jojo','age'=>12]);
有时候,我们需要在所有视图之间共享数据片段,这时候可以使用视图门面的 share 方法,通常,需要在某个服务提供者的 boot 方法中调用 share 方法,你可以将其添加到 AppServiceProvider 或生成独立的服务提供者来存放这段代码逻辑:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* 启动所有应用服务
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
}
/**
* 注册服务提供者
*
* @return void
*/
public function register()
{
//
}
}
定义父模板
<!-- 存放在 resources/views/layouts/app.blade.php -->
<html>
<head>
<title>应用名称 - @yield('title')</title>
</head>
<body>
@section('sidebar')
这里是侧边栏
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
使用模板
定义子页面的时候,可以使用 Blade 的 @extends
指令来指定子页面所继承的布局,继承一个 Blade 布局的视图可以使用 @section
指令注入内容到布局定义的内容片段中,记住,如上面例子所示,这些片段的内容将会显示在布局中使用 @yield
的地方:
<!-- 存放在 resources/views/child.blade.php -->
@extends('layouts.app')
@section('title', 'Laravel学院')
@section('sidebar')
@parent
<p>Laravel 学院致力于提供优质 Laravel 中文学习资源</p>
@endsection
@section('content')
<p>这里是主体内容,完善中...</p>
@endsection
在本例中,sidebar
片段使用 @parent
指令来追加(而非覆盖)内容到继承布局的侧边栏,@parent
指令在视图渲染时将会被布局中的内容替换。sidebar
部分以 @endsection
结束而不是 @show
,@endsection
指令只是定义一个 section 而 @show
指令定义并立即返回这个 section。@yield
指令还接受一个默认值作为第二个参数,这个值会在被 yield 的 section 未定义时被渲染:
@yield('content', View::make('view.name'))
Blade 的 @include
指令允许你很轻松地在一个视图中包含另一个 Blade 视图,所有父级视图中变量在被包含的子视图中依然有效,尽管被包含的视图可以继承所有父视图中的数据,你还可以传递额外参数到被包含的视图,当然,如果你尝试包含一个不存在的视图,Laravel 会抛出错误,如果你想要包含一个有可能不存在的视图,可以使用 @includeIf
指令,如果包含的视图取决于一个给定的布尔条件,可以使用 @includeWhen
指令,与 @includeWhen
相对的指令是 @includeUnless
,要包含给定数组中的存在的第一个视图,可以使用 @includeFirst
指令:
<div>
@include('shared.errors')
<form>
@includeWhen($boolean, 'view.name', ['some' => 'data'])
<!-- Form Contents -->
@includeIf('view.name', ['some' => 'data'])
</form>
@include('view.name', ['some' => 'data'])
<div>
@includeFirst(['custom.admin', 'admin'], ['some' => 'data'])
</div>
</div>
如果引入的子视图存放在某个子目录中,你可能希望为它们设置别名以便于访问。例如,假设 Blade 子视图存放在 resources/views/includes/input.blade.php
中,你可以使用 include
方法来为这个引入设置别名,将 includes.input
设置为 input
,通常,该操作在 AppServiceProvider
的 boot
方法中完成:
//AppServiceProvider中boot方法加入
Blade::include('includes.input', 'input');、
//blade模板中调用 可传递参数
@input(['type' => 'email'])
Blade 的 {{}}
语句已经经过 PHP 的 htmlentities
函数处理以避免 XSS 攻击。要想显示原生数据 {!! $name !!}
。渲染json内容@json($array)
默认情况下,Blade(以及辅助函数 e
)会对 HTML 实体进行双重编码。如果你想要禁止双重编码,可以在 AppServiceProvider
的 boot
方法中调用 Blade::withoutDoubleEncoding()
方法:
由于很多 JavaScript 框架也是用花括号来表示要显示在浏览器中的表达式,如 Vue,我们可以使用 @
符号来告诉 Blade 渲染引擎该表达式应该保持原生格式不作改动。或者使用@verbatim
指令。比如:
<h1>Laravel</h1>
Hello, @{{ name }}.
@verbatim
<div class="container">
Hello, {{ name }}.
</div>
@endverbatim
# 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
# unless语句
<!-- unless 相当于if not -->
@unless (Auth::check())
You are not signed in.
@endunless
# isset语句
@isset($records)
// $records is defined and is not null...
@endisset
#empty语句
@empty($records)
// $records is "empty"...
@endempty
# auth验证 可以加守卫参数 @auth('admin')
@auth
// 用户已登录...
@endauth
@guest
// 用户未登录...
@endguest
# Section 指令 @hasSection 指令判断某个 section 中是否有内容:
@hasSection('navigation')
<div class="pull-right">
@yield('navigation')
</div>
<div class="clearfix"></div>
@endif
# sectionMissing 可用于判断某个 section 是否不包含内容:
@sectionMissing('navigation')
<div class="pull-right">
@include('default-navigation')
</div>
@endif
# 环境指令 @production 指令检查应用是否在生产环境运行:
@production
// Production specific content...
@endproduction
@env('staging')
// 测试环境 "staging"...
@endenv
@env(['staging', 'production'])
// 测试或者生产环境 "staging" or "production"...
@endenv
# switch 语句
@switch($i)
@case(1)
First case...
@break
@case(2)
Second case...
@break
@default
Default case...
@endswitch
# 循环语句
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor
@foreach ($users as $user)
<p>可在循环中加入 break continue </p>
@break
@continue
@if ($user->type == 1)
@continue
@endif
<p>This is user {{ $user->id }}</p>
@if ($user->number == 5)
@break
@endif
@continue($user->type == 1)
<li>{{ $user->name }}</li>
@break($user->number == 5)
@endforeach
@forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>循环为空 no user</p>
@endforelse
@while (true)
<p>I'm looping forever.</p>
@endwhile
# 循环中的 $loop 变量
@foreach ($users as $user)
@foreach ($user->posts as $post)
@if ($loop->parent->first)
This is first iteration of the parent loop.
@endif
@endforeach
@endforeach
$loop
变量还提供了其他一些有用的属性:
属性 | 描述 |
---|---|
$loop->index |
当前循环迭代索引 (从0开始) |
$loop->iteration |
当前循环迭代 (从1开始) |
$loop->remaining |
当前循环剩余的迭代 |
$loop->count |
迭代数组元素的总数量 |
$loop->first |
是否是当前循环的第一个迭代 |
$loop->last |
是否是当前循环的最后一个迭代 |
$loop->even |
是否是当前循环的偶数迭代 |
$loop->odd |
是否是当前循环的奇数迭代 |
$loop->depth |
当前循环的嵌套层级 |
$loop->parent |
嵌套循环中的父级循环变量 |
Blade 还允许你在视图中定义注释,然而,不同于 HTML 注释,Blade 注释并不会包含到 HTML 中被返回:
{{-- This comment will not be present in the rendered HTML --}}
@php
//
@endphp