模板
控制器布局
在 Laravel 中使用模板的一种方法是通过控制器布局。通过在控制器上指定 layout
属性,指定的视图将为您创建,并将是应从操作返回的假定响应。
在控制器上定义布局
class UserController extends BaseController {
/**
* 应用于响应的布局。
*/
protected $layout = 'layouts.master';
/**
* 显示用户资料。
*/
public function showProfile()
{
$this->layout->content = View::make('user.profile');
}
}
Blade 模板
Blade 是 Laravel 提供的一个简单而强大的模板引擎。与控制器布局不同,Blade 由 模板继承 和 部分 驱动。所有 Blade 模板应使用 .blade.php
扩展名。
定义 Blade 布局
<!-- 存储在 app/views/layouts/master.blade.php -->
<html>
<body>
@section('sidebar')
这是主侧边栏。
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
使用 Blade 布局
@extends('layouts.master')
@section('sidebar')
@@parent
<p>这将附加到主侧边栏。</p>
@stop
@section('content')
<p>这是我的主体内容。</p>
@stop
请注意,扩展 Blade 布局的视图仅覆盖布局中的部分。子视图可以使用 @@parent
指令在部分中包含布局的内容,从而允许您附加到布局部分的内容,例如侧边栏或页脚。
有时,例如当您不确定某个部分是否已定义时,您可能希望将默认值传递给 @yield
指令。您可以将默认值作为第二个参数传递:
@yield('section', '默认内容')
其他 Blade 控制结构
输出数据
你好, {{{ $name }}}。
当前的 UNIX 时间戳是 {{{ time() }}}。
在检查存在性后输出数据
有时您可能希望输出一个变量,但您不确定该变量是否已设置。基本上,您想这样做:
{{{ isset($name) ? $name : '默认' }}}
然而,Blade 允许您使用以下方便的快捷方式,而不是编写三元语句:
{{{ $name or '默认' }}}
使用大括号显示原始文本
如果您需要显示一个用大括号包裹的字符串,您可以通过在文本前加上 @
符号来转义 Blade 行为:
@{{ 这不会被 Blade 处理 }}
当然,所有用户提供的数据都应该被转义或净化。要转义输出,您可以使用三重大括号语法:
你好, {{{ $name }}}。
如果您不希望数据被转义,您可以使用双大括号:
你好, {{ $name }}。
在输出由您的应用程序用户提供的内容时要非常小心。始终使用三重大括号语法来转义内容中的任何 HTML 实体。
如果语句
@if (count($records) === 1)
我有一条记录!
@elseif (count($records) > 1)
我有多条记录!
@else
我没有任何记录!
@endif
@unless (Auth::check())
您尚未登录。
@endunless
循环
@for ($i = 0; $i < 10; $i++)
当前值是 {{ $i }}
@endfor
@foreach ($users as $user)
<p>这是用户 {{ $user->id }}</p>
@endforeach
@forelse($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>没有用户</p>
@endforelse
@while (true)
<p>我在无限循环。</p>
@endwhile
包含子视图
@include('view.name')
您还可以将数据数组传递给包含的视图:
@include('view.name', array('some'=>'data'))
重写部分
要完全重写一个部分,您可以使用 overwrite
语句:
@extends('list.item.container')
@section('list.item.content')
<p>这是类型为 {{ $item->type }} 的项目</p>
@overwrite
显示语言行
@lang('language.line')
@choice('language.line', 1)
注释
{{-- 这个注释不会出现在渲染的 HTML 中 --}}
扩展 Blade
Blade 甚至允许您定义自己的自定义控制结构。当 Blade 文件被编译时,每个自定义扩展都会调用视图内容,允许您进行从简单的 str_replace
操作到更复杂的正则表达式的任何操作。
Blade 编译器提供了帮助方法 createMatcher
和 createPlainMatcher
,它们生成您需要的表达式以构建自己的自定义指令。
createPlainMatcher
方法用于没有参数的指令,如 @endif
和 @stop
,而 createMatcher
用于带参数的指令。
以下示例创建了一个 @datetime($var)
指令,该指令简单地调用 $var
上的 ->format()
:
Blade::extend(function($view, $compiler)
{
$pattern = $compiler->createMatcher('datetime');
return preg_replace($pattern, '$1<?php echo $2->format(\'m/d/Y H:i\'); ?>', $view);
});