您的位置:首页 > 编程语言 > PHP开发

laravel 5 blade

2015-09-04 20:49 666 查看
最近在学习laravel这个框架,以前用的框架是CI,虽然一般的框架能应付的过来,可现在要做分布式,于是选了这个框架,不过还没发现这个框架的有点在哪。这都是以后的事,先学好再说吧

网上面关于laravel5的教程挺少的,虽然这个框架不错,但教程少,文档写的又不是太好。所以学习起来就有些费劲,我从网上找了一下,都不是太好,于是就自己总结了一下。

废话就不多说了。先来一个例子,让大家感受一下这个blade模板

在laravel/resources/views里面新建一个名称是 index.blade.php文件

注意用blade模板必须以blade.php名称结尾

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body>
<div class="container">
@yield('content')
</div>
</body>
</html>


在相同目录下建立一个main.blade.php

@extends("study.index")
@section("content")
<h1>About me</h1>
<p>用于测试</p>
@stop;


这样一个简单的页面就写成了。你只需在建立一个控制器即可显示出来效果

@extends(“study.index”)表示我们使用index.balde.php模版,

@section(‘content’) * @stop中间的内容将被填充到@yield(‘content’)的位置。

之后刷新之前的页面,可以看到跟之前的结果是一样的。

接着来说一下blade模板中几个常用的命令

1. @yield 与 @section

@yield
是不可扩展的,如果你要定义的部分没有默认内容让子模板扩展的,
@yield($name, $default)
如果你在子模板中并没有指定这个区块的
内容,它就会显示默认内容,如果定义了,就会显示你定义的内容。

@section
既可以被替代,又可以被扩展,这是最大的区别。
比如:


在上面的同级目录下建立master.blade.php

@yield('title','默认标题')
@section('content')
默认的内容
@show


在同级目录下建立 study.blade.php

@extends('study.master')
@section('title')
@parent
新的标题
@stop

@section('content')
@parent
扩展的内容
@stop


上面的例子中,模板用 @yield 和 @section 分别定义了一个区块,然后在子模板中去定义内容,由于 @yield 不能被扩展,所以即使加上了 @parent 也不起作用,输出的内容只有“新的标题”,替换了“默认的标题”。因此最终生成的页面只能是“默认的标题”或者“新的标题”,不能并存。而 @section 定义的部分,由于使用了 @parent 关键字,父模板中的内容会被保留,然后再扩展后添加的内容进去,输出的内容会是 “默认的内容 扩展的内容”。

2. @show 与 @stop

@show 指的是执行到此处时将该 section 中的内容输出到页面,

@stop 则只是进行内容解析,并且不再处理当前模板中后续对该section的处理, 除非用 @override覆盖(详见下一部分)。

通常来说,在首次定义某个 section 的时候,应该用 @show, 而在替换它或者扩展它的时候,不应该用 @show,应该用 @stop。下面用例子说明:

同级目录下建立zone.blade.php

<div id="zoneA">
@section('zoneA')
AAA
@show
</div>

<div id="zoneB">
@section('zoneB')
BBB
@stop
</div>

<div id="zoneC">
@section('zoneC')
CCC
@show
</div>


接着建立study2.blade.php

@extends('study.zone')

@section('zoneA')
aaa
@stop

@section('zoneB')
bbb
@stop

@section('zoneC')
ccc
@show


在 study.zone 中,用 @stop 来结束 "zoneB",由于整个模板体系中,没有以 @show 结束的 "zoneB" 的定义,因此这个区块不会被显示。而在 study2 中,用 @show 定义了 'zoneC',这会在执行到这里时立即显示内容,并按照模板继承机制继续覆盖内容,因此最终显示的内容会是:
ccc // 来自 study2

<div class="zoneA">
aaa
</div>
<div class="zoneB">
</div>
<div class="zoneC">
ccc
</div>


3. @append 和 @override

刚才说到了,@override 并不是在子模板中指明内容替换父模板的默认内容,而是另有用途,那么是如何使用呢?这又涉及到一个 section 在模板中可以多次使用的问题。也即我们所定义的每一个 section ,在随后的子模板中其实是可以多次出现的。比如:

建立master.blade.php
{{-- master--}}
<div>
@yield('content')
</div>

{{-- subview --}}
@extends('master')

@section('content')
加一行内容
@append

@section('content')
再加一行内容
@append

@section('content')
加够了,到此为止吧。
@stop


三次指定的内容都显示出来了,关键就在于 @append 这个关键字,它表明“此处的内容添加到”,因此内容会不断扩展。而最后用了 @stop,表示这个 section 的处理到此为止。如果在后面继续用 @append 或者 @stop 来指定这个 section 的内容,都不会生效。除非用 @override 来处理。 @override 的意思就是“覆盖之前的所有定义,以这次的为准”。比如:

<div>
@yield('content')
@yield('message')
</div>

{{-- master --}}
<div>
@section('content')
加一行内容
@append
@section('content')
再加一行内容
@append
@section('content')
加够了,结束吧
@stop
@section('content')
都不要了,我说的。
@override
</div>

<div>
都不要了,我说的。
</div>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: