Laravel 是一个功能强大的后端框架,提供了构建现代 Web 应用所需的多种功能,包括路由、验证、缓存、队列和文件存储等。不过我们认为为开发者提供一个完整的全栈体验同样重要,这也包括构建应用的前端。
在使用 Laravel 开发应用时,主要有两种方式处理前端开发:一种是利用 PHP 进行前端开发,另一种则是使用 Vue、React 等 JavaScript 框架。我们将在下面讨论这两种选择,以帮助做出最适合自己项目的决策。
一、使用PHP进行前端开发
1、PHP和Blade模板
传统上,大多数 PHP 应用程序通过简单的 HTML 模板与 PHP 的 `echo` 语句结合使用,从数据库中提取数据并将其渲染到浏览器:
<div> <?php foreach ($users as $user): ?> Hello, <?php echo $user->name; ?> <br /> <?php endforeach; ?> </div>
在 Laravel 中,这种方法可以通过视图和 Blade 模板来实现。Blade 是一种轻量级的模板语言,提供了简洁的语法来显示和迭代数据:
<div> @foreach ($users as $user) Hello, {{ $user->name }} <br /> @endforeach </div>
使用这种方式构建应用程序时,表单提交和其他页面交互通常会导致服务器返回一个新的完整 HTML 文档,浏览器也会重新渲染整个页面。即便在当今,许多应用仍然适合采用这种使用 Blade 模板构建前端的方式。
2、用户需求的增长
然而,随着用户对 Web 应用期望的提升,许多开发者发现需要构建更具动态性和响应性的前端。因此,一些开发者开始转向 Vue 和 React 等现代 JavaScript 框架来开发应用程序的前端。
与此同时,仍有一些开发者希望继续使用他们熟悉的后端语言,因此开发了能使现代 Web 应用 UI 主要使用后端语言构建的解决方案。例如,在 Ruby on Rails 生态系统中,出现了 Turbo、Hotwire 和 Stimulus 等库。
在 Laravel 生态系统中,满足使用 PHP 为现代、动态前端开发需求的解决方案包括 Laravel Livewire 和 Alpine.js。
3、Livewire
Laravel Livewire 是一个用于构建动态、现代和互动 Laravel 前端的框架,它的使用体验类似于使用 Vue 或 React 等现代 JavaScript 框架。
使用 Livewire 时,可以创建渲染 UI 的离散部分,即 Livewire 组件,并公开可供前端调用的方式和数据。例如,一个简单的计数器组件可以如下所示:
<?php namespace App\Http\Livewire; use Livewire\Component; class Counter extends Component { public $count = 0; public function increment() { $this->count++; } public function render() { return view('livewire.counter'); } }
对应的计数器模板可以这样编写:
<div> <button wire:click="increment">+</button> <h1>{{ $count }}</h1> </div>
如上所示,Livewire 允许编写新的 HTML 属性(如 `wire:click`),将 Laravel 应用程序的前端和后端连接起来。同时,可以使用简洁的 Blade 表达式渲染组件的当前状态。
许多开发者认为,Livewire 彻底改变了使用 Laravel 的前端开发体验,使他们能够在熟悉的 Laravel 环境中构建现代、动态的 Web 应用。通常,使用 Livewire 的开发者还会搭配 Alpine.js,以便在前端集成所需的 JavaScript 逻辑,例如实现对话框等功能。
4、入门套件
若希望使用 PHP 和 Livewire 构建前端,可以利用 Laravel 提供的 Breeze 或 Jetstream 入门套件,以加快应用程序的开发。这些入门套件使用 Blade 和 Tailwind,为应用程序提供后端和前端的认证脚手架,帮助迅速开始构建下一个伟大的应用。
二、使用Vue/React进行前端开发
尽管可以利用 Laravel 和 Livewire 构建现代前端,许多开发者仍喜欢使用 Vue 或 React 这样的 JavaScript 框架。这使得开发者可以充分利用 NPM丰富的 JavaScript 包和工具生态系统。
1、Inertia
幸运的是,Laravel 提供了两全其美的解决方案。Inertia 桥接了 Laravel 应用程序和现代 Vue 或 React 前端之间的鸿沟,允许使用 Vue 或 React 构建成熟的现代前端,同时利用 Laravel 路由和控制器进行路由、数据填充和认证 —— 所有这些都在单个代码仓库中。通过这种方法,可以在不削弱任一工具能力的情况下,充分享受 Laravel 和 Vue / React 的全部力量。
在将 Inertia 安装到 Laravel 应用程序后,将像往常一样编写路由和控制器。然而,从控制器返回的不是 Blade 模板,而是 Inertia 页面:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Models\User; use Inertia\Inertia; use Inertia\Response; class UserController extends Controller { /** * 显示给定用户的个人资料。 */ public function show(string $id): Response { return Inertia::render('Users/Profile', [ 'user' => User::findOrFail($id) ]); } }
Inertia 页面对应于 Vue 或 React 组件,通常存储在应用程序的 resources/js/Pages 目录中。通过 Inertia::render 方法给页面提供的数据将用于填充页面组件的 “props”:
2、vue
<script setup> import Layout from '@/Layouts/Authenticated.vue' import { Head } from '@inertiajs/vue3' const props = defineProps(['user']) </script> <template> <Head title="User Profile" /> <Layout> <template #header> <h2 class="text-xl font-semibold leading-tight text-gray-800">个人资料</h2> </template> <div class="py-12">你好, {{ user.name }}</div> </Layout> </template>
Inertia 允许在构建前端时充分利用 Vue 或 React 的全部力量,同时为 Laravel 驱动后端和 JavaScript 驱动前端之间提供了一个轻量级的桥梁。
3、服务器端渲染
如果担心因为应用程序需要服务器端渲染而不敢深入 Inertia,请不要担心。Inertia 提供了服务器端渲染支持。而且,通过 Laravel Forge 部署应用程序时,确保 Inertia 的服务器端渲染进程始终运行非常简单。
4、入门套件
如果希望使用 Inertia 和 Vue / React 构建前端,可以利用我们的 Breeze 或 Jetstream 入门套件 来加速应用程序的开发。这些入门套件使用 Inertia、Vue / React、Tailwind 和 Vite 为应用程序提供后端和前端认证脚手架,以便可以开始构建下一个伟大的想法。
三、打包资源
无论选择使用 Blade 和 Livewire 还是 Vue / React 和 Inertia 开发前端,可能都需要将应用程序的 CSS 打包成生产就绪的资源。当然,如果选择使用 Vue 或 React 构建应用程序的前端,还需要将组件打包成浏览器就绪的 JavaScript 资源。
默认情况下,Laravel 使用 Vite 来打包资源。Vite 提供了极快的构建时间和几乎瞬时的热模块替换(HMR)在本地开发期间。在所有新的 Laravel 应用程序中,包括那些使用我们的入门套件,将找到一个 vite.config.js 文件,该文件加载了我们的轻量级 Laravel Vite 插件,使 Vite 在 Laravel 应用程序中使用成为一种乐趣。
通过使用 Laravel Breeze 开始应用程序开发是开始使用 Laravel 和 Vite 的最快方式,我们最简单的入门套件通过提供前端和后端认证脚手架来加速应用程序开发。