起步套件

Laravel 提供了起步套件,帮你快速搭好应用骨架——注册、登录、密码重置等认证功能开箱即用,路由、控制器、视图都给你备好了。起步套件底层用的是 Laravel Fortify 做认证。

当然,起步套件只是帮你省事,不是必须的。你完全可以从一个空白 Laravel 开始自己搭。

建项目

先确保你装好了 PHP 和 Laravel CLI 工具(没装的话看安装指南)。如果已有 PHP 和 Composer,用 Composer 装一下 Laravel 安装器:

composer global require laravel/installer

跑 laravel new 建项目,安装器会让你选起步套件:

laravel new my-app

项目建好后,装前端依赖、构建前端资源,再启动开发服务器:

cd my-app
npm install && npm run build
composer run dev

开发服务器跑起来后,浏览器打开 http://localhost:8000 就能看到你的应用了。

四个起步套件

React

React 起步套件用 Inertia 把 Laravel 后端和 React 前端连起来。Inertia 让你用传统服务端路由和控制器写现代单页应用——既有 React 的前端能力,又有 Laravel 的后端效率和 Vite 的极速编译。技术栈:React 19、TypeScript、Tailwind、shadcn/ui 组件库。

Svelte

Svelte 起步套件同样基于 Inertia,用 Svelte 做前端。技术栈:Svelte 5、TypeScript、Tailwind、shadcn-svelte 组件库。

Vue

Vue 起步套件也是 Inertia 驱动。技术栈:Vue Composition API、TypeScript、Tailwind、shadcn-vue 组件库。

Livewire

Livewire 起步套件不走 Inertia,而是用 Laravel Livewire 纯 PHP 写动态交互界面。如果你的团队习惯 Blade 模板、不想碰 React / Svelte / Vue 这类 JS 框架,Livewire 是个好选择。技术栈:Livewire、Tailwind、Flux UI 组件库。

定制起步套件

所有起步套件的前后端代码都在你的应用里,想怎么改就怎么改。下面按套件分别说明。

React 定制

React 起步套件基于 Inertia 3、React 19、Tailwind 4 和 shadcn/ui。前端代码主要在 resources/js 目录:

resources/js/
├── components/    # 可复用的 React 组件
├── hooks/         # React hooks
├── layouts/       # 应用布局
├── lib/           # 工具函数和配置
├── pages/         # 页面组件
└── types/         # TypeScript 类型定义

要加 shadcn/ui 组件,先去 shadcn/ui 官网找到你要的组件,然后用 npx 发布:

npx shadcn@latest add switch

比如这条命令会把 Switch 组件发布到 resources/js/components/ui/switch.tsx。发布后就能在页面里用了:

import { Switch } from "@/components/ui/switch"

const MyPage = () => {
  return (
    <div>
      <Switch />
    </div>
  );
};

export default MyPage;

React 布局切换

React 起步套件有两种主布局:侧边栏(sidebar,默认)和顶部导航栏(header)。要切换的话,改 resources/js/layouts/app-layout.tsx 顶部的导入:

import AppLayoutTemplate from '@/layouts/app/app-sidebar-layout'; // [tl! remove]
import AppLayoutTemplate from '@/layouts/app/app-header-layout'; // [tl! add]

React 侧边栏变体

侧边栏还有三种变体:默认(sidebar)、内嵌(inset)、浮动(floating),改 resources/js/components/app-sidebar.tsx 的 variant 属性:

<Sidebar collapsible="icon" variant="sidebar"> [tl! remove]
<Sidebar collapsible="icon" variant="inset"> [tl! add]

React 认证页面布局变体

认证页面(登录、注册等)也有三种布局变体:简约(simple)、卡片(card)、分栏(split)。改 resources/js/layouts/auth-layout.tsx 的导入:

import AuthLayoutTemplate from '@/layouts/auth/auth-simple-layout'; // [tl! remove]
import AuthLayoutTemplate from '@/layouts/auth/auth-split-layout'; // [tl! add]

Svelte 定制

Svelte 起步套件基于 Inertia 3、Svelte 5、Tailwind 和 shadcn-svelte。前端代码在 resources/js:

resources/js/
├── components/    # 可复用的 Svelte 组件
├── layouts/       # 应用布局
├── lib/           # 工具函数、配置和 Svelte rune 模块
├── pages/         # 页面组件
└── types/         # TypeScript 类型定义

添加 shadcn-svelte 组件——先去 shadcn-svelte 官网找到组件,然后:

npx shadcn-svelte@latest add switch

组件会发布到 resources/js/components/ui/switch/switch.svelte,在页面里直接用:

<script lang="ts">
    import { Switch } from '@/components/ui/switch'
</script>

<div>
    <Switch />
</div>

Svelte 布局切换

两种主布局:侧边栏(默认)和顶部导航栏。改 resources/js/layouts/AppLayout.svelte 的导入:

import AppLayout from '@/layouts/app/AppSidebarLayout.svelte'; // [tl! remove]
import AppLayout from '@/layouts/app/AppHeaderLayout.svelte'; // [tl! add]

Svelte 侧边栏变体

侧边栏变体(默认、inset、floating)改 resources/js/components/AppSidebar.svelte:

<Sidebar collapsible="icon" variant="sidebar"> [tl! remove]
<Sidebar collapsible="icon" variant="inset"> [tl! add]

Svelte 认证页面布局变体

认证页面布局变体(simple、card、split)改 resources/js/layouts/AuthLayout.svelte:

import AuthLayout from '@/layouts/auth/AuthSimpleLayout.svelte'; // [tl! remove]
import AuthLayout from '@/layouts/auth/AuthSplitLayout.svelte'; // [tl! add]

Vue 定制

Vue 起步套件基于 Inertia 3、Vue 3 Composition API、Tailwind 和 shadcn-vue。前端代码在 resources/js:

resources/js/
├── components/    # 可复用的 Vue 组件
├── composables/   # Vue composables / hooks
├── layouts/       # 应用布局
├── lib/           # 工具函数和配置
├── pages/         # 页面组件
└── types/         # TypeScript 类型定义

添加 shadcn-vue 组件——先去 shadcn-vue 官网找到组件,然后:

npx shadcn-vue@latest add switch

组件发布到 resources/js/components/ui/Switch.vue,在页面里用:

<script setup lang="ts">
import { Switch } from '@/components/ui/switch'
</script>

<template>
    <div>
        <Switch />
    </div>
</template>

Vue 布局切换

两种主布局:侧边栏(默认)和顶部导航栏。改 resources/js/layouts/AppLayout.vue 的导入:

import AppLayout from '@/layouts/app/AppSidebarLayout.vue'; // [tl! remove]
import AppLayout from '@/layouts/app/AppHeaderLayout.vue'; // [tl! add]

Vue 侧边栏变体

侧边栏变体(默认、inset、floating)改 resources/js/components/AppSidebar.vue:

<Sidebar collapsible="icon" variant="sidebar"> [tl! remove]
<Sidebar collapsible="icon" variant="inset"> [tl! add]

Vue 认证页面布局变体

认证页面布局变体(simple、card、split)改 resources/js/layouts/AuthLayout.vue:

import AuthLayout from '@/layouts/auth/AuthSimpleLayout.vue'; // [tl! remove]
import AuthLayout from '@/layouts/auth/AuthSplitLayout.vue'; // [tl! add]

Livewire 定制

Livewire 起步套件基于 Livewire 4、Tailwind 和 Flux UI。前端代码在 resources/views:

resources/views
├── components            # 可复用组件
├── flux                  # 定制化的 Flux 组件
├── layouts               # 应用布局
├── pages                 # Livewire 页面
├── partials              # 可复用的 Blade 局部模板
├── dashboard.blade.php   # 已认证用户的仪表盘
├── welcome.blade.php     # 访客欢迎页

Livewire 布局切换

两种主布局:侧边栏(默认)和顶部导航栏。切换到顶部导航栏要改 resources/views/layouts/app.blade.php 的布局组件,同时给主 Flux 组件加上 container 属性:

<x-layouts::app.header>
    <flux:main container>
        {{ $slot }}
    </flux:main>
</x-layouts::app.header>

Livewire 认证页面布局变体

认证页面布局变体(simple、card、split)改 resources/views/layouts/auth.blade.php:

<x-layouts::auth.split>
    {{ $slot }}
</x-layouts::auth.split>

认证

所有起步套件都用 Laravel Fortify 处理认证——登录、注册、密码重置、邮箱验证等功能都由 Fortify 提供路由、控制器和业务逻辑。

Fortify 会根据 config/fortify.php 配置文件里启用的功能,自动注册以下路由:

路由 方法 说明
/login GET 显示登录表单
/login POST 执行登录
/logout POST 退出登录
/register GET 显示注册表单
/register POST 创建新用户
/forgot-password GET 显示找回密码表单
/forgot-password POST 发送重置密码链接
/reset-password/{token} GET 显示重置密码表单
/reset-password POST 更新密码
/email/verify GET 显示邮箱验证提示页
/email/verify/{id}/{hash} GET 验证邮箱地址
/email/verification-notification POST 重新发送验证邮件
/user/confirm-password GET 显示确认密码表单
/user/confirm-password POST 确认密码
/two-factor-challenge GET 显示两步验证表单
/two-factor-challenge POST 验证两步验证码

跑 php artisan route:list 命令可以查看应用里所有路由。

开关功能

在 config/fortify.php 的 features 数组里控制哪些功能开着:

use Laravel\Fortify\Features;

'features' => [
    Features::registration(),
    Features::resetPasswords(),
    Features::emailVerification(),
    Features::twoFactorAuthentication([
        'confirm' => true,
        'confirmPassword' => true,
    ]),
],

要关掉某个功能,把对应那行注释掉或删掉就行。比如删掉 Features::registration() 就关闭了公开注册。

注意

用 React、Svelte 或 Vue 起步套件时,关掉功能后还得把前端代码里引用该功能路由的地方也删掉。因为这些套件用 Wayfinder 做类型安全路由,构建时会生成路由定义——引用了不存在的路由会导致构建失败。

自定义用户创建和密码重置

用户注册或重置密码时,Fortify 会调用 app/Actions/Fortify 目录下的 action 类:

文件 说明
CreateNewUser.php 验证并创建新用户
ResetUserPassword.php 验证并更新密码
PasswordValidationRules.php 定义密码验证规则

比如要改注册逻辑,编辑 CreateNewUser:

public function create(array $input): User
{
    Validator::make($input, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'email', 'max:255', 'unique:users'],
        'phone' => ['required', 'string', 'max:20'], // [tl! add]
        'password' => $this->passwordRules(),
    ])->validate();

    return User::create([
        'name' => $input['name'],
        'email' => $input['email'],
        'phone' => $input['phone'], // [tl! add]
        'password' => Hash::make($input['password']),
    ]);
}

两步验证(2FA)

起步套件内置了两步验证,兼容任何 TOTP 验证器应用(如 Google Authenticator、Authy 等)。在 config/fortify.php 里 Features::twoFactorAuthentication() 默认就是开着的。其中 confirm 选项要求用户在启用 2FA 前先验证一次验证码;confirmPassword 要求开关 2FA 时输入密码确认。详见 Fortify 两步验证文档。

速率限制

速率限制防止暴力破解和频繁登录尝试。在 FortifyServiceProvider 里自定义:

use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Cache\RateLimiting\Limit;

RateLimiter::for('login', function ($request) {
    return Limit::perMinute(5)->by($request->email.$request->ip());
});

团队

React、Svelte、Vue 和 Livewire 起步套件都支持开启团队功能。开启后,每个用户属于一个或多个团队,并有一个「当前团队」。注册时会自动给新用户创建一个个人团队。套件还自带团队管理页面:创建团队、切换团队、邀请成员、修改团队信息。

跟团队绑定的路由,URL 里会带上当前团队的 slug。比如仪表盘路由变成 /{current_team}/dashboard,团队管理页面用 settings/teams/{team} 这类路由。起步套件会自动校验当前用户是否属于请求的团队,不属于就不让访问。

起步套件还为已认证用户的当前团队注册了 URL 默认值,所以 route('dashboard') 这类调用会自动带上当前团队的 slug。用户登录、注册或切换团队时,当前团队和 URL 默认值都会同步更新。

创建或重命名团队时,起步套件会阻止使用可能和路由前缀冲突的保留名称——比如 settings、login、dashboard 这些名字不能当团队名。

WorkOS AuthKit 认证

除了 Laravel 内置认证,起步套件还提供了 WorkOS AuthKit 版本,额外支持:

  • 社交登录(Google、Microsoft、GitHub、Apple)
  • 通行密钥(Passkey)认证
  • 基于邮箱的「Magic Auth」魔术链接
  • SSO 单点登录

使用 WorkOS 需要注册 WorkOS 账号,100 万月活以下免费。在 laravel new 创建应用时选 WorkOS 选项就行。

配置 WorkOS 起步套件

创建好 WorkOS 版应用后,在 .env 文件里配置这三个环境变量,值从 WorkOS 应用面板里拿:

WORKOS_CLIENT_ID=your-client-id
WORKOS_API_KEY=your-api-key
WORKOS_REDIRECT_URL="${APP_URL}/authenticate"

另外在 WorkOS 面板里配好应用首页 URL——用户退出登录后会被跳转到这个地址。

配置 AuthKit 认证方式

建议在 WorkOS AuthKit 设置里关掉「Email + Password」认证,只保留社交登录、通行密钥、Magic Auth 和 SSO。这样你的应用就完全不用处理用户密码了。

配置 AuthKit 会话超时

建议把 WorkOS AuthKit 的会话不活动超时时间调成跟你 Laravel 应用一致,通常是两小时。

Inertia SSR

React、Svelte 和 Vue 起步套件都支持 Inertia 的服务端渲染。构建 SSR 包:

npm run build:ssr

还有个更方便的 composer dev:ssr 命令——它会先构建 SSR 包,然后同时启动 Laravel 开发服务器和 Inertia SSR 服务器,让你在本地用 SSR 测试:

composer dev:ssr

社区维护的起步套件

用 laravel new 建应用时,--using 参数可以指定任何发布在 Packagist 上的社区起步套件:

laravel new my-app --using=example/starter-kit

发布你自己的起步套件

把你的起步套件发布到 Packagist 就行。记得在 .env.example 里定义需要的环境变量,安装后要跑的命令写在 composer.json 的 post-create-project-cmd 数组里。

常见问题

怎么升级

起步套件给你一个扎实的起点,代码全在你手里,想怎么改怎么改。起步套件本身不需要「更新」——它就是你的代码了。

怎么开启邮箱验证

打开 app/Models/User.php,取消注释 MustVerifyEmail 的导入,让模型实现 MustVerifyEmail 接口:

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
// ...

class User extends Authenticatable implements MustVerifyEmail
{
    // ...
}

注册后用户会收到验证邮件。要限制某些路由必须验证邮箱才能访问,给路由加上 verified 中间件:

Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('dashboard', function () {
        return Inertia::render('dashboard');
    })->name('dashboard');
});

信息

用 WorkOS 版起步套件时不需要邮箱验证——WorkOS 已经帮你验证了。

怎么改默认邮件模板

想把邮件样式改成跟你应用的品牌一致?跑这条命令把邮件视图发布到你的应用里:

php artisan vendor:publish --tag=laravel-mail

发布后在 resources/views/vendor/mail 目录下会生成一堆文件。改 HTML 模板或 resources/views/vendor/mail/themes/default.css 样式文件就能调整邮件的外观。