模板

目录

基础介绍

您的应用程序的大多数页面可能使用同一个页面布局. 在每个控制器动作手动创建这种布局是一件十分痛苦的事情. 指定一个控制器布局, 将使您的开发更加愉快. 看下如何开始:

在控制器中定义"layout"属性:

class Base_Controller extends Controller {

    public $layout = 'layouts.common';

}

通过控制器动作访问布局:

public function action_profile()
{
    $this->layout->nest('content', 'user.profile');
}

提示: 当你调用布局时, 动作方法中无需有任何返回值.

章节(Sections)

视图章节(Sections)提供了一个简单的方法将嵌套视图的内容注入到布局中. 例如, 也许你想将在布局头部注入嵌入视图所需的JavaScript文件. 可以这样做:

在视图中创建章节:

<?php Section::start('scripts'); ?>
    <script src="jquery.js"></script>
<?php Section::stop(); ?>

加载章节内容:

<head>
    <?php echo Section::yield('scripts'); ?>
</head>

通过Blade标签操作章节:

@section('scripts')
    <script src="jquery.js"></script>
@endsection

<head>
    @yield('scripts')
</head>

Blade模板引擎

Blade让你的视图模板非常纯净. 要创建blade视图, 视图文件的名称要以 ".blade.php"结尾. Blade允许您使用美丽的, 不刺眼的语法编写PHP控制结构和数据输出.这是一个例子:

通过Blade输出变量:

Hello, {{$name}}.

通过Blade输出函数结果:

{{ Asset::styles() }}

加载一个视图:

<h1>Profile</hi>

@include('user.profile')

提示: 当使用Blade的@include表达式时, 被引入的视图将自动继承所有当前被注入的视图数据.

用Blade创建一个循环:

<h1>Comments</h1>

@foreach ($comments as $comment)
    The comment body is {{$comment->body}}.
@endforeach

另外的Blade控制结构:

@if (count($comments) > 0)
    I have comments!
@else
    I have no comments!
@endif

@for ($i =0; $i < count($comments) - 1; $i++)
    The comment body is {{$comments[$i]}}
@endfor

@while ($something)
    I am still looping!
@endwhile

"for-else"控制结构:

@forelse ($posts as $post)
    {{ $post->body }}
@empty
    There are not posts in the array!
@endforelse

"unless"控制结构:

@unless(Auth::check())
    {{ HTML::link_to_route('login', 'Login'); }}
@endunless

// Equivalent...

<?php if ( ! Auth::check()): ?>
    ...
<?php endif; ?>

Blade注释:

@if ($check)
    {{-- This is a comment --}}
    ...
@endif

提示: Blade注释,并不像传统的HTML注释,它不会在生成的HTML代码中显示.

Blade布局

Blade并不只为通用的PHP控制结构提供干净优雅的语法, 在视图中它也会给你提供一个美丽的使用布局的方法.例如你的程序中使用叫做"master"的视图来提供一个通用界面, 内容可以是这样:

<html>
    <ul class="navigation">
        @section('navigation')
            <li>Nav Item 1</li>
            <li>Nav Item 2</li>
        @yield_section
    </ul>

    <div class="content">
        @yield('content')
    </div>
</html>

请注意所取得的"content"章节.我们需要一些文本来填充它. 所以我们创建另外的一个视图(profile)来使用这个布局:

@layout('master')

@section('content')
    Welcome to the profile page!
@endsection

现在, 我们可以在路由中简单的返回"profile"视图了.

return View::make('profile');

"profile"视图是自动使用"master"模板的, 这要归功于Blade的@layout表达式.

有时候你想扩展视图章节, 而不是简单的覆盖他, 例如, "master"视图的导航列表, 假设, 我们只是想追加一个新的列表项, 我们可以这么做:

@layout('master')

@section('navigation')
    @parent
    <li>Nav Item 3</li>
@endsection

@section('content')
    Welcome to the profile page!
@endsection

注意这个Blade的@parent结构. 他会被"master"视图的导航列表所替代. , 为你提供美丽而强大的方法进行布局的延伸和继承