模板
简介
所有的视图都保存在resource/views
下,所有的视图文件都被保存成fileName.blade.php
这样的命名格式。而且其中也支持编写原生的PHP代码!
模板继承
<!--基础模板 base.blade.php-->
<title>@section('title','这里是默认值')</title>
section('content')
这里是基础内容,如果下面有相同section,就会进行覆盖
@show
@yield('footer')
@show
<!--继承模板 extends.blade.php-->
@extends('base.blade.php')
@section('content')
这里是新的内容
@stop
section()
yield()
首先是这两个的区别,可以看这篇文章,里面介绍的很好。但是为了防止日后上面的超链接失效,所以在这里这里做一个转述。在介绍这两个的区别之前,要先介绍另一个特殊标签@parent
。这个标签可以读取模板中标签的内容,比如:
@section('anyName')
这里是基础模板的内容
@show
@section('anyName')
@parent
parent标签会将基础模板的内容也显示出来
@stop
最后输出的结果为:
这里是基础模本的内容
parent标签会将基础模板的内容也显示出来
但是!!!对于@yield
这个效果是不存在的,@yield
只会将结果进行覆盖,即使使用@parent
,也不能在其中输出基础模板中的内容。所以,如果上面使用@yield
来代替@section
的话,那么最后的结果就是:
parent标签会将基础模板的内容也显示出来
show
stop
上面的例子中,这两个标签是跟在@section
和@yield
后面的,这两个标签有什么用呢?我个人感觉比较实在的说法是:@show
能使从@section
或者@yield
开始的部分在下一个继承页面也有效,而@stop
则仅能使该部分仅在当前页面有效。看下面这个例子,也是来源于上面那位大哥:
<!--这里是基础模板 base.blade.php-->
@section('anyName')
注意,这里是以show结尾的
@show
@section('anyName2')
注意,这里是以stop结尾的
@stop
<!--这里是继承模板 extends.blade.php-->
@extends('base.blade.php')
@section('anyName')
这里的内容还会显示,而且覆盖基础模板内容
@stop
@section('anyName2')
这里的内容不会显示,因为基础模板使用@stop结尾,该部分section不再在继承模板中进行输出
@stop
所以一般情况下,都是在基础模板中使用@show
开始,在继承模板中使用@stop
结尾。
append
override
这两个从名字上来看好像也蛮好区分的,@append
表示追加,@override
则是覆盖。顺道一提,这两个都是用在在一个文件中扩展@section
或者@yield
的情况下的。比如下面的例子:
<!--基础模板 base.blade.php -->
@section('part1')
第一部分
@show
@yield('part2')
第二部分
@show
<!--继承模板 extends.blade.php -->
@section('part1')
这里会追加基础模板的内容,而不是覆盖
@append
@section('part1')
不止可以追加一次,可以追加多次
@append
@yield('part2')
yield的调用方式是一样的
@append
<!--这里演示 override.blade.php -->
@section('part1')
注意这段代码的最后
@append
@section('part1')
这里再追加一点内容
@append
@section('part1')
这里会把上面所有的内容进行一个覆盖,所以最后只会显示这部分内容。
@overide
parent
上面演示过了,就是输出父模板的内容。
extends()
上面也演示过了,这里就多插一句,当视图文件不是直接保存resource/views
下时,比如基础模板保存在resource/views/layout
路径下,且文件名为default.blade.php
,则继承该文件时,应该这么写:@extends('layout.default')
,这里以.
表示文件路径,最后只要加上文件名default
,并不需要完整的文件名。
组件和插槽
component
slot
这两个玩意怎么用呢?直接来看例子,简单易懂。首先是一个基础组件,这个组件有其基础的内容,但是同时也接受来自调用者的参数输入。
<!--基础组件 component.blade.php -->
<!--这里的title是需要调用组件时进行渲染的-->
<h1>{{ $title }}</h1>
<p>
<!--这部分是默认渲染的内容-->
{{ $slot }}
</p>
@component('component')
@slot('title')
这里就是传入组件component的title参数
@endslot
这里就是传入slot部分的参数
@endcomponent
@component('component',['key'=>'value'])
上面使用数组形式将额外参数传递进组件中
@endcomponent
在组件中只需要调用对应的{{$key}}
就可以获取传递进来的参数了。
数据输出
正常输出
{{ $key }}
判断输出
{{ isset($key)?$key:'默认值' }}
JavaScript输出
为了防止JavaScript
脚本的代码和Laravel的原生Blade
模板引擎起冲突,可以设置verbatim
标签来防止Blade
编译其中的内容。
@verbatim
<!--在这里面写JavaScript的代码,Blade模板引擎是不会编译的-->
@endverbatim
流程控制
判断
@if @elseif @else @endif
循环
@for @endfor @foreach @endforeach
判断 + 循环
@forelse @while
这里特别介绍一下@forelse
,详细介绍
现在假设原始代码是这样的
@foreach($users as $user)
@if(!empty($user))
{{$user->name}}
@elseif
未命名
@endif
@endforeach
这样在循环中嵌套判断很麻烦,所以Laravel对上述过程做了简化,就变成了forelse
。
@forelse($users as $user)
{{$user->name}}
@empty
未命名
endforelse
终止循环
@break @continue
其中还可以引入条件判断:
@foreach($users as $user)
@continue($user->id>5)
{{$user->name}}
@break($user->==10)
@endforeach
其中,当用户的id
小于5时,不输出该用户的姓名,但是循环仍在继续,直到用户的id
大于5。但是在用户的id
等于10时,结束循环。
$loop
这玩意很好!
$loop变量 | 说明 |
---|---|
$loop->index | 当前循环的索引,注意,不是array数组的索引,而是单纯的从0开始的计数索引 |
$loop->iteration | 当前循环的迭代,从1开始 |
$loop->remaining | 当前循环的剩余迭代 |
$loop->count | 当前循环的总迭代次数 |
$loop->first | 是否是当前循环的第一个迭代 |
$loop->last | 是否是当前循环的最后一个迭代 |
$loop->depth | 当前循环的嵌套层级 |
$loop->parent | 嵌套循环中父级的$loop变量 |
注释
Blade模板引擎的注释是:{{--这里填写注释语句--}}
PHP代码
@php @endphp
子视图
@include()
当有路径问题时,也是使用.
来代表文件夹。
当然,也可以往子视图中传入参数:@include('subView',['key'=>'value'])
堆栈
直接看例子吧,我觉得是蛮鬼畜的:
@push('anyName')
<script src='/scriptName.js'></script>
@endpush
这里的@push
就是将一个key
为anyName
,value
为<script src='/scriptName.js'></script>
的键值对存入堆栈中。
当想要调用该键值对时,只需要调用@stack
命令即可:
@stack('anyName')
自定义标签
首先,这个自定义标签是设置在服务提供者中的,关于如何自定义服务创建者,可以看这篇文章。直接来看如何设置以及如何调用:
设置自定义标签
public function boot(){
Blade::directive('DIYLabelName',function($inputParam){
return "<?php echo "这里就是定义调用该自定义标签时输出的PHP代码".$inputParam; ?>";
});
}
调用自定义标签
然后在视图文件中就可以调用自定义标签:
@DIYLabelName(',然后这样传入参数');
清除视图缓存
php artisan view:clear
# 我猜可能还有一条命令是缓存视图的
php artisan view:cache