Skip to content

模板

控制器布局

在 Laravel 中使用模板的一种方法是通过控制器布局。通过在控制器上指定 layout 属性,指定的视图将为您创建,并将是应从操作返回的假定响应。

在控制器上定义布局

php
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 布局

php
<!-- 存储在 app/views/layouts/master.blade.php -->

<html>
	<body>
		@section('sidebar')
			这是主侧边栏。
		@show

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

使用 Blade 布局

php
@extends('layouts.master')

@section('sidebar')
	@@parent

	<p>这将附加到主侧边栏。</p>
@stop

@section('content')
	<p>这是我的主体内容。</p>
@stop

请注意,扩展 Blade 布局的视图仅覆盖布局中的部分。子视图可以使用 @@parent 指令在部分中包含布局的内容,从而允许您附加到布局部分的内容,例如侧边栏或页脚。

有时,例如当您不确定某个部分是否已定义时,您可能希望将默认值传递给 @yield 指令。您可以将默认值作为第二个参数传递:

php
@yield('section', '默认内容')

其他 Blade 控制结构

输出数据

php
你好, {{{ $name }}}

当前的 UNIX 时间戳是 {{{ time() }}}

在检查存在性后输出数据

有时您可能希望输出一个变量,但您不确定该变量是否已设置。基本上,您想这样做:

php
{{{ isset($name) ? $name : '默认' }}}

然而,Blade 允许您使用以下方便的快捷方式,而不是编写三元语句:

php
{{{ $name or '默认' }}}

使用大括号显示原始文本

如果您需要显示一个用大括号包裹的字符串,您可以通过在文本前加上 @ 符号来转义 Blade 行为:

php
@{{ 这不会被 Blade 处理 }}

当然,所有用户提供的数据都应该被转义或净化。要转义输出,您可以使用三重大括号语法:

php
你好, {{{ $name }}}

如果您不希望数据被转义,您可以使用双大括号:

php
你好, {{ $name }}
lightbulb

在输出由您的应用程序用户提供的内容时要非常小心。始终使用三重大括号语法来转义内容中的任何 HTML 实体。

如果语句

php
@if (count($records) === 1)
	我有一条记录!
@elseif (count($records) > 1)
	我有多条记录!
@else
	我没有任何记录!
@endif

@unless (Auth::check())
	您尚未登录。
@endunless

循环

php
@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

包含子视图

php
@include('view.name')

您还可以将数据数组传递给包含的视图:

php
@include('view.name', array('some'=>'data'))

重写部分

要完全重写一个部分,您可以使用 overwrite 语句:

php
@extends('list.item.container')

@section('list.item.content')
	<p>这是类型为 {{ $item->type }} 的项目</p>
@overwrite

显示语言行

php
@lang('language.line')

@choice('language.line', 1)

注释

php
{{-- 这个注释不会出现在渲染的 HTML --}}

扩展 Blade

Blade 甚至允许您定义自己的自定义控制结构。当 Blade 文件被编译时,每个自定义扩展都会调用视图内容,允许您进行从简单的 str_replace 操作到更复杂的正则表达式的任何操作。

Blade 编译器提供了帮助方法 createMatchercreatePlainMatcher,它们生成您需要的表达式以构建自己的自定义指令。

createPlainMatcher 方法用于没有参数的指令,如 @endif@stop,而 createMatcher 用于带参数的指令。

以下示例创建了一个 @datetime($var) 指令,该指令简单地调用 $var 上的 ->format()

php
Blade::extend(function($view, $compiler)
{
	$pattern = $compiler->createMatcher('datetime');

	return preg_replace($pattern, '$1<?php echo $2->format(\'m/d/Y H:i\'); ?>', $view);
});