文章归档友情连接照片地图

Blade 的正确使用姿势

分类:PHP编程  作者:rming  时间:2015-03-29

Blade 的正确使用姿势
        概括说,在 layout 中定义 yield,在extends 后实现 yield,个人见解。

典型应用

{{--layout--}}
@include('inc.header')
@yield('menu')
@yield('sidebar')
@yield('content')
@include('inc.footer')
{{--page--}}
@extends('layout')
@include('inc.menu')
@include('inc.sidebar')
@section('content')
<p>I am Content!</p>
@stop
@section('footer')
<script type="text/javascript">
alert('is all in ?')
</script>
@parent
@stop

备注:inc.sidebarinc.menu是具体的代码实现。

yield or section

        yield 在编程语言中一般认为是生成器,和 generator 的概念关联比较大,通常,一个使用了 yield 关键字的函数(对象方法)就可以认为是一个生成器函数(对象)了,但是 Blade 中的 yield 并非如此。

        Blade 中的 yield,应用场景是当你不确定这个 section 在后面的代码中是否会被定义使用,此时,可以定义一个

@yield('section_name', 'Default Content')

来提前声明,这里有一个 叫section_namesection ,在后面的代码中我们来实现它,通过这个描述,我觉得这个 yield 更像是定义了一个 abstract function ,我们在后面的代码中来完成它的实现(当然,你也完全可以不用管他)。

应用场景:

{{--layout--}}
@include('header')
@yield('sidebar')
@include('footer')
{{--article-page--}}
@extends('layout')
@section('sidebar')
<p>I am sidebar.</p>
@stop

我们定义 或者 不定义 siderbar ,它就在那里,这就为后来的模板个性化留下了操作空间。

从这点看,yield更像是我们预留的扩展接口::

{{--header--}}
@section('header')
<html>
<head>
<title>{{ $title or 'title'}}</title>
@yield('html_header')
<head>
@show
{{--layout--}}
@include('header')
@yield('sidebar')
@include('footer')
{{--article-page--}}
@extends('layout')
@include('sidebar')
@section('content')
<div class="article">
blablabla...
</div>
@show
@section('html_header')
<style>
.article{line-height:1.2em;}
</style>
@stop
{{--sidebar--}}
@section('sidebar')
<p>I am sidebar.</p>
@stop
@section('html_header')
@parent
<style>
.sidebar{float:left;}
</style>
@stop

我们不论实在 sidebar 中定义样式表,还是在article中定义样式表,都可以通过预留的 html_header yield写到header中。

@show, @stop, @overwrite and @append

当然,我们实现了 yield声明的section后,我们也可以去 重载/附加 这个section,比如

{{--article-page--}}
@extends('layout')
@section('sidebar')
<p>I am sidebar.</p>
@stop
@if(is_admin())
@include('sidebar_admin');
@endif
{{--sidebar_admin--}}
@section('sidebar')
@parent
<a href="/admin/login">管理员登陆</a>
@stop

注意: 如果被extends后的layout中既存在 section 定义,又在 include中存在定义,那么代码执行顺序将是 先执行 section in file 然后 再执行 section in include,比如:

{{--article-page--}}
@extends('layout')
{{--提前了sidebar_admin的引入--}}
@if(is_admin())
@include('sidebar_admin');
@endif
@section('sidebar')
<p>I am sidebar.</p>
@stop

但是,此时仍然是先执行 section in file 然后再执行section in include中的 “附加管理员登陆链接” 的操作。

在最初的 layout 使用 @show 完成基本的框架显示,然后当article-page extends layout 以后,我们可以使用各种 @section(实现之前的yield声明),@overwrite(重载section),@append(附加内容)

备注:其实,当神奇的@parent出现后,@append的功能显得不是很有必要,因为完全可以使用@parent完成相同的功能:

{{--article-page--}}
@extends('layout')
@section('notice')
<p>notice:blablabla...</p>
@stop
@section('notice')
@parent
<p>append:be careful!</p>
@stop
@section('notice')
<p>append:be careful!</p>
@append


提交评论