视图
在前面的开发中,程序的运行结果都是通过在控制器中使用return 语句返回一个字符串,或使用dump()函数来实现的。为了更好地输出一个HTML页面,可以利用视图来实现。
一、创建视图文件
Laravel的视图文件可以是一个普通的.php
文件,也可以是基于Laravel内置的Blade模板引擎编写的.blade.php
文件
- xxx.blade.php 表示使用Blade模板引擎,支持模板语法和PHP原生语法。
如
{{ $title }}
和<?php echo $title; ?>
。 - xxx.php 表示不使用模板引擎,只支持PHP原生语法。
注:如果存在同名的".blade.php"和".php"文件时,优先使用前者
视图文件保存在`resources\view`目录中,用户也可以在该目录下创建子目录,将不同模块的视图放在不同的子目录中
1.1 操作
-
新建
shop.blade.php
视图文件 -
新建一个控制器
cmdphp artisan make:controller Shop/ShopController
phppublic function shop() { return view('shop'); //view('shop') === /resources/views/shop.blade.php }
-
添加路由
php// 视图路由 Route::get('shop/index','Shop\ShopController@shop');
-
访问
http://127.0.0.1/shop/index
1.2 视图文件夹路径
如果是views下面的文件夹里面的内容
视图名称前添加路径:两种写法都用于加载resources\views\home\test\show.blade.php
-
方法一
phppublic function shop() { return view('shome\test\shop'); }
-
方法二
phppublic function shop() { return view('home.test.shop'); }
二、向视图传递数据
-
在视图文件中并不能直接访问控制器中的变量,而是需要在控制器中为视图传递数据。
-
使用view()函数或with()函数可以为视图传递数据。
php
// 方式1:通过view()函数的第2个参数传递数据
return view(模板文件, 数组);
// 方式2:通过with()函数传递数据
return view(模板文件)->with(数组);
// 方式3:通过连续调用with()函数传递数据
return view(模板文件)->with(名称, 值)->with(名称, 值)...
操作
TestController
php
public function show()
{
$data = [
'content' => '文本内容'
];
return view('show', $data);
}
show.blade.php
php
<body>
{{ $content }}
</body>
三、视图数据处理
3.1.特殊字符转义
Blade模板引擎在输出字符串时,会自动进行HTML特殊字符的转义。
TestController
php
public function show()
{
return view('shop.index.shop')->with('content','<b>加粗文字</b>');
}
如果禁止Blade自动转义,在变量输出时使用
{!! $content !!}
。
show.blade.php
php
<body>
{!! $content !!}
</body>
3.2. 通过函数对数据进行处理
在视图中输出数据时,可以通过函数来对数据进行处理
TestController
php
public function show()
{
return view('shop.index.shop')->with('time',time());
}
show.blade.php
php
<body>
当前时间为 {{ date('Y-m-d H:i:s', $time) }}
</body>
四、循环判断操作
在页面中,需要进行循环、判断操作
4.1 循环操作
-
在视图中输出数组时,需要对数组进行遍历,此时可以通过"@foreach"模板语法来实现。该语法类似PHP 中的foreach 语句。
php@foreach ($variable as $key => $value) // 循环体 @endforeach
-
操作
控制器
phppublic function show() { $data = [['id' => 1, 'name' => 'Tom'], ['id' => 2, 'name' => 'Andy']]; return view('show', ['data' => $data]); }
视图文件
php<body> <h1>循环操作</h1> @foreach ($data as $v) {{ $v['id'] }} - {{ $v['name'] }} <br> @endforeach </body>
4.2 判断操作
-
在视图文件中还可以使用"@if"模板语法进行判断操作,该语法类似PHP 中的if 语句。
php@if (条件表达式1) // 语句1 @elseif (条件表达式2) // 语句2 @elseif (条件表达式3) // 语句3 ...... @else // 以上条件都不满足时执行的语句 @endif
-
在TestController的show()方法中使用date()函数获取当前是星期几,将获取结果传给视图
控制器文件
phppublic function shop() { $week =date('N'); return view('shop.index.shop',['week'=>$week]); }
视图文件
php<body> <h1>判断操作</h1> 今天是: @if ($week==1) 星期一 @elseif ($week==2) 星期二 @elseif ($week==3) 星期三 @elseif ($week==4) 星期四 @elseif ($week==5) 星期五 @elseif ($week==6) 星期六 @elseif ($week==7) 星期天 @endif </body>
五、模板的继承与包含
一个网站由多个页面组成,而多个页面可能会有一些公共的部分,这些公共部分的代码是重复的。为了防止代码重复,可以通过模板继承、模板包含两种方式将公共代码拆分到单独的视图文件中。
5.1 模板继承
模板继承是指将一个完整页面中的公共部分放在父页面中,将不同的部分放在不同的子页面中,子页面可以继承父页面来获得完整的页面
语法
-
"@yield()"用于在父页面中定义一个区块,其参数是区块的名称,表示将子页面中对应的内容显示在此区块中。
-
"@extends('需要继承的父页面') )"用于在子页面中继承父页面。
-
"@section('区块名称')"用于在子页面中定义区块内容。
父页面
php
<body>
<header>头部区域</header>
<div>
@yield('content')
</div>
<footer>尾部区域</footer>
</body>
子页面
php
<body>
@extends('parent')
@section('content')
<section>我的区块</section>
@endsection
</body>
控制器
php
public function show()
{
return view('child'); //子页面
}
别忘了控制器的路由哦!
5.2 模板包含
把多个页面中相同的部分抽取到子页面中,然后通过@include()将公共部分包含进来,得到完整的页面。
主页面
php
<body>
@include('header')
<div>内容区域</div>
@include('footer')
</body>
头部区域文件resources\views\header.blade.php
html
<body>
<header>头部区域</header>
</body>
尾部区域文件resources\views\footer.blade.php
html
<body>
<footer>尾部区域</footer>
</body>
控制器
php
public function show()
{
return view('main');
}