一、Blade模板引擎及模板继承的使用
View时MVC中很重要的一部分,使用Blade模板引擎是打开Laravel中VIew的大门最重要的一步。
Blade是Laravel提供的一个既简单又强大的模板引擎
和其它流行的PHP模板引擎不一样,Blade并不限制你在视图中使用原生PHP代码
所有Blade视图页面都将被编译成原生PHP代码并缓存起来,除非你的模板文件被修改了,否则不会重新编译
模板继承
一般一个网站会有头部和尾部,很多页面都有相同的头部和尾部。当然还有公共的css、js的引入,这些东西不可能每个页面都做一遍,这样做起来很浪费时间,维护起来也很头疼。如果使用一个基础页面,将这些事情都做了,其它页面继承这个页面,如果公共部分有需要修改的,只需要修改基础页面就可以了,这就是为什么使用模板继承。
基础页面代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo</title><!-- - @yield('title')-->
<style type="text/css">
.header{
width: 1000px;
height: 150px;
margin: 0 auto;
background: #f5f5f5;
border: 1px solid #ddd;
}
.main{
width: 1000px;
height: 300px;
margin: 0 auto;
margin-top: 15px;
clear: both;
}
.main .sidebar{
float: left;
width: 20%;
height: inherit;
background: #f5f5f5;
border: 1px solid #ddd;
}
.main .content{
float:right;
width: 75%;
height: inherit;
background: #f5f5f5;
border: 1px solid #ddd;
}
.footer{
width: 1000px;
height: 150px;
margin: 0 auto;
margin-top: 15px;
background: #f5f5f5;
border: 1px solid #ddd;
}
</style>
</head>
<body>
<div class="header">
<!-- @section('header') -->
头部
<!-- @show -->
</div>
<div class="main">
<div class="sidebar">
<!-- @section('sidebar') -->
侧边栏
<!-- @show -->
</div>
<div class="content">
<!-- @yield('content', '主要内容区域') -->主要内容区域
</div>
</div>
<div class="footer">
<!-- @section('footer') -->
底部
<!-- @show -->
</div>
</body>
</html>
在resources/views下创建一个模板文件
将刚才的代码粘贴进来,这里边一般放公用的部分。
layouts.blade.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo - @yield('title')</title>
<style type="text/css">
.header{
width: 1000px;
height: 150px;
margin: 0 auto;
background: #f5f5f5;
border: 1px solid #ddd;
}
.main{
width: 1000px;
height: 300px;
margin: 0 auto;
margin-top: 15px;
clear: both;
}
.main .sidebar{
float: left;
width: 20%;
height: inherit;
background: #f5f5f5;
border: 1px solid #ddd;
}
.main .content{
float:right;
width: 75%;
height: inherit;
background: #f5f5f5;
border: 1px solid #ddd;
}
.footer{
width: 1000px;
height: 150px;
margin: 0 auto;
margin-top: 15px;
background: #f5f5f5;
border: 1px solid #ddd;
}
</style>
</head>
<body>
<div class="header">
@section('header')
头部
@show
</div>
<div class="main">
<div class="sidebar">
@section('sidebar')
侧边栏
@show
</div>
<div class="content">
@yield('content', '主要内容区域')
</div>
</div>
<div class="footer">
@section('footer')
底部
@show
</div>
</body>
</html>
为什么有的地方用yield,有的地方用session?
@section既可以单独显示父模板的默认内容,也可以单独显示子模板的新内容,通过@parent还可以同时显示父子模板中的内容
而@yield只能显示其中一个,子模板不定义,就用父模板默认的,子模板定义,父模板的内容会被覆盖,通过@parent也不能显示。
最大的区别就是@yield是不可扩展的,因为它在视图中只声明定义了一个视图片段,没有任何内容。@session既可以在页面视图中定义一个片段,也可以有内容,还可以被子模板扩展。
在StudentController.php中新建一个方法如下:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Student;//记得添加这个
class StudentController extends Controller{//一个控制器对用一个视图目录,所以在resources/views下创建一个student目录,一个方法对应一个视图文件,所以在student目录下创建一个session1文件
public function session1(){//记得添加路由
return view('student.session1');//也可以view('student/session1')
}
}
session1.blade.php
@extends('layouts') <!-- 这个文件就在views下,所以直接写上文件名就行
如果你想对继承的模板重写,可以这样
重写头部 -->
@section('header')
@parent <!-- 将父模板中的也输出来 -->
header
@stop
<!-- 如果想修改yield中的内容 -->
@section('content')
content <!-- 注意,这个不能继承 -->
@stop
二、基础语法及include的使用
session1.blade.php
@extends('layouts') <!-- 这个文件就在views下,所以直接写上文件名就行
如果你想对继承的模板重写,可以这样
重写头部 -->
@section('header')
@parent <!-- 将父模板中的也输出来 -->
header
@stop
<!-- 如果想修改yield中的内容 -->
@section('content')
content <!-- 注意,这个不能继承 -->
<!--模板中输出php变量-->
<p>{{$name}}</p>
<!--模板中使用php函数-->
<p>{{time()}}</p>
<p>{{date('Y-m-d H:i:s',time())}}</p>
<p>{{ in_array($name,$arr) ? true : false }}</p>
<p>{{var_dump($arr)}}</p>
<!--原样输出,比如就想输出两个花括号加$name-->
<p>@{{$name}}</p><!--前边加@就可以了-->
{{--模板中的注释 这个在网页源码中都看不到这个注释--}}
{{--引入子视图 include 前边使用模板布局可以实现引入子视图,因为有的地方不是大家都需要 ,但是,又有很多地方需要用,这个时候就需要include 现在在student下创建一个common1.blade.php--}}
{{--引入子视图--}}
{{--里边可以传递值--}}
@include('student.common1', ['message' => '这是向字模板中传递的值'])
@stop
common1.blade.php
<p>commin1.blade.php页面 <br />{{$message}}</p>
三、流程控制
StudentController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Student;//记得添加这个
class StudentController extends Controller{//一个控制器对用一个视图目录,所以在resources/views下创建一个student目录,一个方法对应一个视图文件,所以在student目录下创建一个session1文件
public function session1(){//记得添加路由
$name = 'shulvLY1';
$arr = array('shulvLY1', 'shulvLY2');
$students = Student::get();
return view('student.session1', [
'name' => $name,
'arr' => $arr,
'students' => $students
]);//也可以view('student/session1')
}
}
session1.blade.php
@extends('layouts') <!-- 这个文件就在views下,所以直接写上文件名就行
如果你想对继承的模板重写,可以这样
重写头部 -->
@section('header')
@parent <!-- 将父模板中的也输出来 -->
header
@stop
<!-- 如果想修改yield中的内容 -->
@section('content')
content <!-- 注意,这个不能继承 -->
<!--
流程控制
1,if
2,unless
3,for
4,foreach
-->
<br />
<!--if-->
@if($name == 'shulvLY1')
I'm shulvLy1
@elseif($name == 'shulvLy2')
I'm shulvLy2
@else
Who am I?
@endif
<br />
<!--在if中也可以使用php函数-->
@if(in_array($name, $arr))
true
@else
false
@endif
<br />
<!--unless可以看作是if的取反-->
@unless($name != 'shulvLY1')
I'm shulvLy1
@endunless
<br />
<!--for-->
<!-- @for($i=0; $i<5; $i++)
<p> {{ $i }}</p>
@endfor -->
<!--foreach一般用来输出一个对象或数组-->
@foreach($students as $student)
<p>{{$student->name}}</p>
@endforeach
<!--foreach还有一个变形叫forelse-->
@forelse($students as $student)
<p>{{$student->name}}</p>
@empty
<p>这里是空的</p><!--当$students是空的,就会执行这条-->
@endforelse
@stop
四、模板中的URL
在StudentController.blade.php中新建一个urlTest()方法
StudentController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Student;//记得添加这个
class StudentController extends Controller{
public function session1(){//记得添加路由
$name = 'shulvLY1';
$arr = array('shulvLY1', 'shulvLY2');
$students = Student::get();
return view('student.session1', [
'name' => $name,
'arr' => $arr,
'students' => $students
]);//也可以view('student/session1')
}
public function urlTest(){//记得添加路由,起个别名'url'
return 'urlTest';
}
}
session1.blade.php
@extends('layouts') <!-- 这个文件就在views下,所以直接写上文件名就行
如果你想对继承的模板重写,可以这样
重写头部 -->
@section('header')
@parent <!-- 将父模板中的也输出来 -->
header
@stop
<!-- 如果想修改yield中的内容 -->
@section('content')
content <!-- 注意,这个不能继承 -->
<!--
模板中的URL
1,url() 通过route名称生成URL
2,action() 通过指定控制器及方法名生成URL
3,route() 通过路由别名生成URL
-->
<br />
<a href="{{url('url')}}">url()</a><!--通过路由的名字生成--><br />
<a href="{{action('StudentController@urlTest')}}">action()</a><br />
<a href="{{route('url')}}">route()</a>
@stop