了解Laravel Blade及其使用方法

了解Laravel Blade及其使用方法

Laravel 的模板引擎支持 React、Vue 和其他库。然而,开发者最喜欢的还是 Laravel Blade 引擎的强大功能,它可以快速创建模块化、可重用的视图。Blade 可以让你毫不费力地扩展布局、定义版块,并使用控制结构生成数据驱动的内容。

这篇实践文章将探讨 Blade 是什么、如何工作以及如何增强你的 Laravel 应用程序。

使用 Laravel Blade 所需的一切

Laravel Blade 是 Laravel 框架的默认模板引擎。它能让你在 HTML 代码中直接使用变量、循环、条件语句和其他 PHP 功能。要创建 Blade 文件,只需在 Laravel 项目的 resources/views 目录下创建扩展名为 .blade.php 的文件,定义 Blade 视图,然后在这些文件中构建你喜欢的动态页面。

为什么要使用 Blade?

Blade的一个主要优点是它的模块化代码组织。Blade可以将代码组织成可重复使用的模块,您可以轻松地添加、删除或更新这些模块,而不会影响应用程序的其他部分。

代码封装是 Blade 的另一个优势。Blade 可帮助封装功能,使测试、调试和代码维护更加易于管理。这种方法有利于大型应用程序,因为没有组织的应用程序很快就会变得难以管理。

Blade 的模板引擎性能卓越,是我们测试过的速度最快的 PHP 框架。该引擎会将所有 Blade 视图编译成纯 PHP 代码,然后缓存起来,直到你修改它们。这种方法提高了渲染速度和整体性能。

如何使用 Laravel Blade

在本教程中,我们将创建一个 Laravel 应用程序来体验 Blade 模板的实际应用。学习定义和扩展 Blade 布局、在 Blade 视图之间传递数据、使用各种可用的控制结构,以及创建自己的 Blade。

先决条件

要学习本教程,请确保您具备以下条件:

  • 熟悉 PHP
  • 已安装 Composer。运行 composer -V 验证系统中是否安装了 Composer。

请查看完整的教程代码,以便在工作时获得指导。

如何创建 Laravel 应用程序

要创建 Laravel 应用程序示例,请运行:

composer create-project laravel/laravel my-app

按照终端上的提示完成应用程序的制作。

接下来,进入应用程序目录,使用此命令为其提供服务:

cd my-app
php artisan serve

点击终端中的链接,在浏览器上打开 Laravel 欢迎页面。

如何定义布局

布局可让您配置网络应用程序的各个部分,以便在多个页面之间共享。例如,如果您的应用程序在各个页面中使用一致的导航栏和页脚,那么一次创建比为每个页面重新创建更有效。

在学习逐步说明之前,请先看看下面的骨架演示。

创建无布局网站的代码如下所示。它要求你为每个页面重新编写导航栏和页脚代码。

<!-- Page 1 -->
<nav>. . . </nav>
Content for page 1
<footer> . . . </footer>
<!-- Page 2 -->
<nav>. . . </nav>
Content for page 2
<footer> . . . </footer>

相反,您可以使用布局轻松构建应用程序,在单个代码块中共享相同的组件:

<!-- Main layout code -->
<nav>. . . </nav>
{slot}
<footer> . . . </footer>

一旦定义了布局,就可以在任何页面上使用:

<!-- Page 1 or Page n -->
<main-layout>
Content for page n
</main-layout>

在旧版本的 Laravel 中,你必须使用模板继承来创建布局。然而,当公司添加了组件功能后,创建强大的布局就变得容易多了。

要使用 Laravel Blade 创建一个新布局,首先要运行这条命令来创建布局的组件:

php artisan make:component Layout

该命令会生成一个新的 layout.blade.php 文件,该文件位于 resources/views/ 目录下名为 components 的新文件夹中。打开该文件并粘贴以下代码:

<html>
<head>
<title>{{ $title ?? 'Example Website' }}</title>
<link rel="stylesheet" href="{{ asset('/css/app.css') }}">
</head>
<body>
<nav>
<h3>Welcome to my website</h3>
<hr>
</nav>
{{ $slot }}
<footer>
<hr />
© 2023 example.com
</footer>
</body>
</html>

这段代码将创建一个具有简单导航栏和页脚的布局组件。 slot 函数定义了在扩展布局组件时传递主要内容的位置。

如何扩展布局

您可以使用标签在 blade  视图中轻松导入组件。此方法同样适用于你之前创建的布局组件。

要查看扩展布局的效果,请打开默认的 resources/views/welcome.blade.php 文件,并用以下代码替换该文件的内容:

<x-layout>
<div>
<h1>Hello World!</h1>
<p>Lorem ipsum dolor sit amet consectetur adipiscing elit. Hic, aut?</p>
<button class="btn">Get Started</button>
</div>
</x-layout>

这种方法可以更新欢迎页面以使用布局组件,同时传递一个标题元素和一段模拟文本作为其内容。重新加载之前打开的链接,查看更改。

在布局定义中,请注意如果代码不传递标题数据,则会呈现默认为 “Example Website” 的标题数据。您可以通过 <x-slot name="slotName" /> 代码在视图中以命名槽的形式传递这些数据,在本例中就是 <x-slot name="title" /> 。用下面的代码更新 welcome.blade.php 文件,然后重新加载页面:

<x-layout>
<x-slot name="title">
Home | Example Website
</x-slot>
<div>
<h1>Hello World!</h1>
<p>Lorem ipsum dolor sit amet consectetur adipiscing elit. Hic, aut?</p>
<button class="btn">Get Started</button>
</div>
</x-layout>

接下来,添加一些样式来增强应用程序的外观。在 /public/css 目录下新建一个 app.css 文件,然后粘贴该文件中的代码。

完成所有这些更新后,您在 http://127.0.0.1:8000/ 上预览应用程序时应该会看到以下输出。

Hello world

Hello world

如何加入后台数据

在前面的示例中,你通过插槽在组件和视图之间轻松地共享了数据。不过,从数据库或其他远程源加载数据有更好的方法。

在这种情况下,可以直接从路由器定义中加载和传递数据,并像访问前例中的命名槽一样访问数据。为此,请打开 routes/web.php 文件,并用以下代码替换其内容:

<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
$name = "John Doe";
return view('welcome', ['name' => $name]);
});

在上面的代码中,您更新了网络路由,将名称 ” John Doe ” 传递给了欢迎视图。现在,像这样在 blade 视图中访问这个值:

<div>
Hello, {{ $name }}
<!-- Outputs: Hello, John Doe -->
</div>

您可以使用这种方法从数据库加载数据。例如,假设您有一个包含待办事项列表的待办事项表。使用 DB facade 加载这些待办事项,并将它们传递给视图:

<?php
use Illuminate\Support\Facades\DB; // Import DB Facade
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
$todos = DB::table('todos')->get();
return view('welcome', ['todos' => $todos]);
});

不过,如果您没有数据库,可更新网络入口路由以传递静态待办事项数组。打开 routes/web.php 文件,用下面的代码更新默认 ( / ) 路由:

Route::get('/', function () {
$todos = ['Learn Laravel', 'Learn Blade', 'Build Cool Stuff'];
return view('welcome', ['todos' => $todos]);
});

用下面的代码替换 welcome.blade.php 文件的内容,以 JSON 编码数组的形式访问待办事项。

<x-layout>
<x-slot name="title">
Home | Example Website
</x-slot>
<p>{{ json_encode($todos) }}</p>
<!-- Output:  ["Learn Laravel","Learn Blade","Build Cool Stuff"] -->
</x-layout>

如何使用控制快捷键

Blade 模板引擎还支持多个指令,以有条件地呈现各种数据类型。例如,要遍历传给欢迎视图的 to-dos 返回数组,可在 welcome.blade.php 文件中粘贴以下代码,应用 foreach 循环:

<x-layout>
<x-slot name="title">
Home | Example Website
</x-slot>
<ul>
@foreach ($todos as $todo)
<li>{{ $todo }}</li>
@endforeach
</ul>     
</x-layout>

这一更改将以无序列表的形式显示待办事项,就像下面的截图一样。

无序列表中的待办事项

无序列表中的待办事项

要构建条件语句块,可使用 @if@elseif@else@endif 指令。例如

@if (count($todos) === 1)
<p>I have one task!</p>
@elseif (count($todos) > 1)
<p>I have multiple tasks!</p>
@else
<p>I don't have any tasks!</p>
@endif

用上述代码替换 welcome.blade.php 文件的内容。各种 if-else 指令会计算待办事项,并在不同情况下显示自定义信息。如果您的待办事项数组中包含多个任务,您就会在浏览器中看到输出 “I have multiple tasks!”(我有多个任务!)。

你可以在 Laravel 文档中找到更多支持的指令。

如何构建自定义扩展

您也可以编写与上例类似的自定义指令。要探索这种技术,请创建一个自定义文本截断指令。

首先,运行以下命令创建一个新的服务提供器

php artisan make:provider TruncateTextServiceProvider

该命令会生成一个新的服务提供器文件,文件名为 app/Providers/TruncateTextServiceProvider.php。打开该文件并将其内容替换为

<?php
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class TruncateTextServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
Blade::directive('truncate', function ($expression) {
list($text, $length) = explode(',', $expression);
return "<?php echo Str::limit($text, $length); ?>";
});
}
}

代码导入了 Blade Facade,并定义了一个名为 @truncate 的新自定义指令。该指令接受两个参数: $text$length 。它使用 Str::limit() 方法将文本截断到指定长度。

最后,将服务提供者添加到 config/app.php 配置文件中的提供者数组中,注册服务提供者:

'providers' => [
// Other service providers
App\Providers\TruncateTextServiceProvider::class,
],

在 Blade 模板(welcome.blade.php)中使用自定义指令,通过 @truncate 语法调用它。

<div>
@truncate('Lorem ipsum dolor sit amet', 10)
<!-- Outputs: Lorem ipsu... -->
</div>

小结

本文探讨了 Laravel Blade 如何帮助你简化开发流程,同时为网络应用程序创建模块化和可重用的视图。然而,你的 Laravel 开发之旅不应该就此结束。

评论留言