在 Laravel 中,视图(View) 和 模板引擎(Blade) 是构建动态网页内容的核心工具。视图用于呈现数据,模板引擎 Blade 则帮助你更简洁、灵活地生成 HTML 内容。
1. 视图(View)
视图是用户在浏览器中看到的页面内容。在 Laravel 中,视图通常存储在 resources/views 目录下,视图文件默认使用 .blade.php 扩展名(表示使用 Blade 模板引擎)。
1.1 返回视图
在 Laravel 控制器中,可以通过 view() 函数返回视图。例如,在 UserController 中返回一个视图:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
return view('user.index');
}
}
这会加载 resources/views/user/index.blade.php 文件并返回给浏览器。
1.2 传递数据到视图
你可以通过 view() 函数的第二个参数将数据传递到视图。例如,向视图传递一个变量 name:
return view('user.index', ['name' => 'John Doe']);
在视图中可以使用 Blade 语法来显示传递的变量:
<h1>Hello, {{ $name }}</h1>
1.3 带有多个数据项
你可以传递多个数据项给视图,通过数组或者 compact() 函数:
return view('user.index', compact('name', 'age'));
在视图中,可以访问这些变量:
<h1>Name: {{ $name }}</h1>
<p>Age: {{ $age }}</p>
2. Blade 模板引擎
Blade 是 Laravel 提供的强大的模板引擎,它使得生成 HTML 页面更加简洁、灵活。Blade 文件使用 .blade.php 扩展名。
2.1 Blade 基本语法
2.1.1 输出数据
Blade 使用双大括号语法 {{ }} 来输出数据:
<h1>Hello, {{ $name }}</h1>
2.1.2 转义输出
Blade 会自动对变量进行 HTML 转义,防止 XSS 攻击。如果不想转义,可以使用 {!! !!} 语法:
<p>{!! $htmlContent !!}</p>
2.1.3 控制结构
Blade 提供了很多方便的控制结构,如条件语句、循环等。
- 条件语句:
@if ($user)
<h1>Hello, {{ $user->name }}</h1>
@else
<h1>Guest</h1>
@endif
- 循环语句:
@foreach ($users as $user)
<p>{{ $user->name }}</p>
@endforeach
- 其他控制结构:
@forelse ($users as $user)
<p>{{ $user->name }}</p>
@empty
<p>No users found.</p>
@endforelse
2.2 Blade 继承与布局
Laravel 的 Blade 引擎支持视图继承,允许你将公共部分提取到父布局文件中,以减少重复的代码。
2.2.1 定义父布局
通常,将布局文件放在 resources/views/layouts 目录下。例如,创建一个父布局文件 resources/views/layouts/app.blade.php:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Laravel App</title>
</head>
<body>
<header>
<h1>Welcome to Laravel</h1>
</header>
<div class="content">
@yield('content')
</div>
</body>
</html>
2.2.2 子视图继承父布局
在子视图中使用 @extends 来继承父布局,并使用 @section 来定义具体内容:
@extends('layouts.app')
@section('content')
<h2>This is the user dashboard.</h2>
<p>Welcome, {{ $user->name }}.</p>
@endsection
通过这种方式,父布局中的 HTML 结构会被复用,而具体内容可以在子视图中进行修改。
2.3 Blade 部分视图(子视图)
Blade 允许你将视图文件拆分为多个部分,以便于复用和组织代码。常见的子视图可以放在 resources/views/partials 目录中。
例如,创建一个导航部分视图 resources/views/partials/nav.blade.php:
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
</ul>
在主视图中通过 @include 来加载子视图:
@include('partials.nav')
2.4 Blade 组件
Laravel 还支持 Blade 组件,它们是可以重用的、封装的 UI 组件,适用于更复杂的界面。
2.4.1 创建组件
使用 Artisan 命令创建 Blade 组件:
php artisan make:component Alert
这将创建一个组件类 app/View/Components/Alert.php 和视图文件 resources/views/components/alert.blade.php。
在组件视图中可以定义 HTML 结构:
<div class="alert alert-{{ $type }}">
{{ $slot }}
</div>
2.4.2 使用组件
在 Blade 视图中使用组件:
<x-alert type="danger">
Something went wrong!
</x-alert>
2.5 Blade 路由
Blade 还支持生成路由链接。你可以使用 route() 辅助函数生成命名路由的 URL:
<a href="{{ route('profile') }}">Go to Profile</a>
3. Blade 缓存
Blade 视图会被自动缓存,以提高性能。在生产环境中,Laravel 会缓存所有的视图文件。如果你对视图做了更改,可以通过 Artisan 命令清除视图缓存:
php artisan view:clear
4. Blade 性能优化
- 避免使用不必要的复杂逻辑:将复杂的业务逻辑从视图中提取到控制器或服务类中,保持视图简洁。
- 使用缓存:对于渲染复杂的视图,可以使用 Laravel 的视图缓存来提高性能。
- 精简布局文件:将公共部分提取到布局文件中,以减少视图的重复代码。