laravel学习笔记(三)视图渲染
1、模板继承
1)定义模板
示例如下
a)主模板(resources/views/common/layout.blade.php):
<html> <head> <title>@yield('title')</title> </head> <body> @section('topbar') 主页面顶部内容 @show <div class="container"> @yield('content') </div> </body> </html>
其中@section('xxx')...@show和@yield('xxx')都是用来显示继承模板中指定块的内容的,只是@section('xxx')...@show之间的内容可以被继承模板通过@parent的方式获取
b)继承模板(resources/views/home/home.blade.php):
@extends('common.layout') @section('title', '标题') @section('topbar') @parent <p>子页面顶部内容</p> @stop
@section('content')
<p>子页面主体内容</p>
@stop
其中@extends指令用来指定子页面所继承的布局,@section('xxx', '内容')和@section('xxx')...@stop用来定义指定块的内容,@parent用来追加主模板中指定块原有的内容
2、包含子视图
Blade的@include指令允许在一个视图中包含另一个Blade视图,所有父级视图中变量在被包含的子视图中依然有效,如下:
<div> @include('文件夹.子视图') <form> <!-- Form Contents --> </form> </div>
如果需要传递额外的变量,可以通过如下方式
@include('文件夹.子视图', ['参数名' => '参数值'])
如果要包含一个有可能不存在的视图,可以使用 @includeIf 指令,如下:
@includeIf('文件夹.子视图', ['参数名' => '参数值'])
如果包含的视图取决于一个给定的布尔条件,可以使用 @includeWhen 指令:
@includeWhen($boolean, '文件夹.子视图', ['参数名' => '参数值'])
要包含给定数组中的第一个视图,可以使用 @includeFirst 指令:
@includeFirst(['文件夹1.子视图1', '文件夹2.子视图2'], ['参数名' => '参数值'])
如果要循环引入多个局部视图,可以使用 @each 指令:
@each('文件夹.子视图', $参数数组, '子视图中的参数名')
在子视图中,可以通过$子视图中的参数名获取$参数数组中对应的值,且可以通过key变量访问当前迭代的键值,如在$参数数组为空时,需要引用其他子视图的话,可以增加第四个变量,如下:
@each('文件夹.子视图', $参数数组, '子视图中的参数名','文件夹.为空时的子视图')
3、堆栈
Blade 允许你推送内容到命名堆栈,以便在其他视图或布局中渲染。这方便在子视图中引入指定JavaScript和css库,如下:
@push('scripts') <script src="/example.js"></script> @endpush
推送次数不限,要渲染完整的堆栈内容,传递堆栈名称到 @stack 指令即可:
<head> @stack('scripts') </head>
4、服务注入
@inject指令可以用于从服务容器中获取服务,传递给 @inject 的第一个参数是服务对应的变量名,第二个参数是要解析的服务类名或接口名:
@inject('metrics', 'App\Services\MetricsService') <div> Monthly Revenue: {{ $metrics->monthlyRevenue() }}. </div>
5、Blade其他指令
1)可以使用 @if , @elseif , @else 和 @endif 来构造 if 语句,这些指令的功能和 PHP 相同,如下:
@if (count($records) === 1) I have one record! @elseif (count($records) > 1) I have multiple records! @else I don't have any records! @endif
2)为方便起见,Blade 还提供了 @unless...@endunless 指令,表示除非,如下:
@unless (1==1) 1!=1 @endunless
3)此外,Blade 还提供了 @isset...@endisset、@empty...@endempty、@switch...@endswitch、@case、@break、@default、@for...@endfor、@foreach...@endforeach、@forelse...@empty...@endforelse、@while...@endwhile等方法,起到判断和循环的作用,如在循环中,可以通过$loop变量判断当前循环的状态,$loop变量的属性如下:
6、自定义blade指令
如需自定义blade指令,可以在app/Providers/AppServiceProvider.php的boot方法中增加如下代码:
\Blade::directive('datetime', function($expression) { return "<?php echo date('Y-m-d H:i:s', $expression); ?>"; });
然后在blade模板中通过如下方式引用:
@datetime(1508888888)
注:更新完 Blade 指令逻辑后,必须删除所有的 Blade 缓存视图。缓存的 Blade 视图可以通过 Artisan 命令 view:clear 移除。
如还想自定义if语句,可以在boot方法中通过Blade::if 方法定义:
\Blade::if('env', function ($environment) { return app()->environment($environment); });
在blade模板中使用方式如下:
@env('local') The application is in the local environment... @else The application is not in the local environment... @endenv