1. 简介
视图view
包含应用程序app
所要渲染的HTML代码,目的是将应用的显示逻辑和控制逻辑进行分离,即分离控制器controller
和网页呈现上的逻辑。Laravel的视图存放在resources/views/
目录下,视图文件以.php
作为后缀。
2. 视图辅助函数
view()
定义在vendor\laravel\framework\src\Illuminate\Foundation\helpers.php
中的,调用了Factory
的make()
对传入的参数做处理并用这些参数初始化View
类,再返回View
的实例。
/**
* Get the evaluated view contents for the given view.
*
* @param string $view 对应resources/views目录内视图文件名称
* @param array $data 视图内使用的数据
* @param array $mergeData
* @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
*/
function view($view = null, $data = [], $mergeData = [])
{
//调用了Factory
$factory = app(ViewFactory::class);
if (func_num_args() === 0) {
return $factory;
}
//对传入的参数做处理并用这些参数初始化View类,再返回View的实例。
return $factory->make($view, $data, $mergeData);
}
3. 视图传参
通常,路由将请求交给控制器,控制器从模型中获取视图所需显示的数据,因此需要在控制器中绑定数据到视图。
- 将数组作为绑定数据传入
$data = ['title'=>'homepage','charset'=>'UTF-8'];
$view = view('home',$data);
- with(key,value)传统方式传递数据到视图
$view = view('home')->with('title','homepage');
- with(key,value)链式绑定数据到视图
$view = view('home')->with('title','homepage')->with('charset','UTF-8');
- withKey(value)魔数方法传递数据到视图
$view = view('home')->withTitle('homepage');
- 通过属性绑定数据
$view = view('home');
$view.title = 'homepage';
- 通过数据访问接口绑定数据
$view = view('home');
$view['title'] = 'homepage';
[案例]
class DemoController extends Controller
{
public function index()
{
$title = 'homepage';
$setting = [
'lang' => 'zh',
'charset' => 'utf-8',
];
//使用compact()将不同类型的变量合并为关联数组
$view = view('demo', compact('title','setting'));
return $view;
}
}
4. 模板引擎
模板引擎需要完成最基本三项功能:
- 变量输出
- 流程控制
- 引入继承
Laravel默认使用Blade模板引擎,Blade中可使用原生PHP代码输出,Blade视图模板最终都将被“编译”(正则替换)成原生PHP代码并缓存,除非模板文件被修改否则不会重新编译。Blade模板使用.blade.php
作为文件扩展名。
变量输出
{{{...}}}
用于转义输出
{{$name or 'defualt_value'}}
默认值输出
{{isset($name)?$name:''}}
三元条件判断
{{$var}}
之间是要输出的变量内容,此种方式会与某些JS框架发生冲突,例如在AngularJS中采用{{}}
进行数据绑定,因此可使用@{{ $var }}
语法告知Blade渲染引擎表达式保留原样。
在Blade中@
打头的都是指令,例如流程控制的输出@if...@ifend
。
默认使用{{$var}}
语法会自动传递给PHP的htmlentities()
来对变量进行HTML实体化处理以避免XSS攻击。使用{!! $var !!}
可避免htmlentities()
处理,进而原样输出。
流程控制
条件分支
- 使用
@i...@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
{{ $item->name }}
@if ($item->count >= 100)
@break
@endif
@endforeach
把条件和指令声明放在同一行
@foreach ($list as $item)
@continue($item->status == 1)
{{ $item->name }}
@break($item->count >= 100)
@endforeach
循环变量$loop
的属性对于循环控制提供了很好的帮助。
@foreach ($list as $item)
@if ($loop->first)
迭代第一条
@endif
@if ($loop->last)
迭代最后一条
@endif
{{ $item->name }}
@endforeach
循环迭代$loop
属性
- $loop->index 以索引值0开始当前循环迭代的位置下标
- $loop->iteration 当前循环迭代从1开始
- $loop->remaining 循环中剩余的迭代
- $loop->count 数组中要迭代的条目总数
- $loop->first 是否为循环中第一次迭代
- $loop->last 是否为循环中最后一次迭代
- $loop->depth 当前循环嵌套的层级
- loop变量
引入继承
模板引入
Blade提供@include
指令以便于在一个视图中引入另一个视图,所有父视图中变量均在被引入子视图中可用。另外可向被包含的视图传递额外数据。
@include('view.head', ['data'=>'list'])
模板继承
Blade提供模板继承和部件可使不同页面使用统一的布局,当定义子视图时,使用@extends
指令指定子视图需继承的父视图,使用@section
指令向布局的部件中注入内容。
- @section 指令定义内部的部件
- @yield 指令为给定部件展示内容
- @extends 指令指定子视图所需继承的父视图
[案例] 视图的布局通常都会拥有一个统一的模板,可建立统一的基础布局模板layout.blade.php
,让其他视图文件都来继承自它。
resources/view/layout.blade.php
@{{$title}}
@yield('content')
resources/views/demo.blade.php
@extends('layout')
@section('content')
demo page
@stop
[案例]带有侧边栏的布局
resources/view/layout.blade.php
@{{$title}}
@yield('content')
resources/views/child.blade.php
@extends('layout')
@section('sidebar')
@parent
- 菜单条目
- 菜单条目
- 菜单条目
@endsection
@section('content')
demo page
@endsection