本指南包含 Laravel 的核心概念、详细注释和实例代码,帮助您快速学习 Laravel 技术。
Laravel 是一个基于 PHP 的优雅 Web 应用框架,由 Taylor Otwell 创建。它遵循 MVC 架构模式,提供了丰富的功能组件,包括路由、数据库 ORM、模板引擎、队列、缓存等,旨在让 Web 开发变得更加简单和愉悦。
// Laravel 11.x 系统要求
PHP >= 8.2
Composer
MySQL >= 5.7 或 PostgreSQL >= 9.6
Apache/Nginx
mod_rewrite(Apache)或 URL 重写(Nginx)
OpenSSL PHP 扩展
PDO PHP 扩展
Mbstring PHP 扩展
Tokenizer PHP 扩展
XML PHP 扩展
Ctype PHP 扩展
JSON PHP 扩展
BCMath PHP 扩展
// 使用 Composer 创建 Laravel 项目
composer create-project laravel/laravel my-app
// 进入项目目录
cd my-app
// 启动开发服务器
php artisan serve
// 访问应用
// http://localhost:8000
// 使用 Laravel 安装器(需要先全局安装)
composer global require laravel/installer
// 创建新项目
laravel new my-app
// Laravel 目录结构
my-app/
├── app/ // 应用核心代码
│ ├── Console/ // 命令行命令
│ ├── Exceptions/ // 异常处理
│ ├── Http/ // HTTP 层
│ │ ├── Controllers/ // 控制器
│ │ ├── Middleware/ // 中间件
│ │ └── Requests/ // 表单请求
│ ├── Models/ // 模型
│ └── Providers/ // 服务提供者
├── bootstrap/ // 框架启动文件
├── config/ // 配置文件
├── database/ // 数据库相关
│ ├── factories/ // 模型工厂
│ ├── migrations/ // 数据库迁移
│ └── seeders/ // 数据填充
├── public/ // 公共访问目录
│ └── index.php // 入口文件
├── resources/ // 资源文件
│ ├── css/ // CSS 文件
│ ├── js/ // JavaScript 文件
│ └── views/ // 视图文件
├── routes/ // 路由文件
│ ├── api.php // API 路由
│ ├── channels.php // 广播频道
│ ├── console.php // 控制台路由
│ └── web.php // Web 路由
├── storage/ // 存储目录
│ ├── app/ // 应用文件
│ ├── framework/ // 框架生成文件
│ └── logs/ // 日志文件
├── tests/ // 测试文件
├── vendor/ // Composer 依赖
├── .env // 环境配置
├── artisan // 命令行工具
└── composer.json // Composer 配置
// .env - 环境配置文件
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:your-app-key
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心部分:
// 控制器(Controller)
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
// 用户列表方法
public function index()
{
// 调用模型获取数据
$users = User::all();
// 渲染视图
return view('users.index', compact('users'));
}
// 用户详情方法
public function show($id)
{
// 根据ID获取用户
$user = User::findOrFail($id);
// 渲染视图
return view('users.show', compact('user'));
}
}
// 模型(Model)
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// 指定表名
protected $table = 'users';
// 指定主键
protected $primaryKey = 'id';
// 自动时间戳
public $timestamps = true;
// 可填充字段
protected $fillable = ['name', 'email', 'password'];
// 隐藏字段
protected $hidden = ['password', 'remember_token'];
}
// 视图(View)
// resources/views/users/index.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<h1>用户列表</h1>
<ul>
@foreach($users as $user)
<li>{{ $user->name }}</li>
@endforeach
</ul>
</div>
@endsection
// 控制器:app/Http/Controllers/IndexController.php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class IndexController extends Controller
{
// 首页方法:显示用户统计信息
public function index()
{
// 调用模型获取统计数据
$userCount = User::count();
$activeUsers = User::where('status', 1)->count();
// 传递数据到视图
return view('index', [
'title' => '用户管理系统',
'userCount' => $userCount,
'activeUsers' => $activeUsers
]);
}
// 用户详情方法:显示单个用户信息
public function user($id)
{
// 根据ID获取用户,如果不存在则抛出404异常
$user = User::with('posts')->findOrFail($id);
// 渲染视图并传递用户数据
return view('users.show', compact('user'));
}
}
// routes/web.php - Web 路由
use Illuminate\Support\Facades\Route;
// 基本路由
Route::get('/', function () {
return view('welcome');
});
// 返回字符串
Route::get('/hello', function () {
return 'Hello World!';
});
// 返回 JSON
Route::get('/api', function () {
return response()->json(['message' => 'Hello API']);
});
// 带参数的路由
Route::get('/user/{id}', function ($id) {
return 'User ID: ' . $id;
});
// 可选参数
Route::get('/user/{name?}', function ($name = 'Guest') {
return 'Hello, ' . $name;
});
// 正则表达式约束
Route::get('/user/{id}', function ($id) {
return 'User ID: ' . $id;
})->where('id', '[0-9]+');
// 多个参数
Route::get('/post/{post}/comment/{comment}', function ($postId, $commentId) {
return "Post: {$postId}, Comment: {$commentId}";
});
// 命名路由
Route::get('/user/profile', function () {
return 'User Profile';
})->name('profile');
// 控制器路由命名
Route::get('/user/profile', [UserController::class, 'profile'])->name('user.profile');
// 生成命名路由 URL
$url = route('profile');
$url = route('user.profile', ['id' => 1]);
// 重定向到命名路由
return redirect()->route('profile');
return redirect()->route('user.profile', ['id' => 1]);
// 路由分组
Route::prefix('admin')->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
Route::get('/users', [AdminController::class, 'users']);
});
// 带中间件的路由分组
Route::middleware(['auth', 'admin'])->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
Route::get('/users', [AdminController::class, 'users']);
});
// 子域名路由
Route::domain('admin.example.com')->group(function () {
Route::get('/', [AdminController::class, 'index']);
});
// 命名空间路由
Route::namespace('Admin')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
});
// 资源路由
Route::resource('users', UserController::class);
// 等同于以下路由
// Route::get('/users', [UserController::class, 'index'])->name('users.index');
// Route::get('/users/create', [UserController::class, 'create'])->name('users.create');
// Route::post('/users', [UserController::class, 'store'])->name('users.store');
// Route::get('/users/{user}', [UserController::class, 'show'])->name('users.show');
// Route::get('/users/{user}/edit', [UserController::class, 'edit'])->name('users.edit');
// Route::put('/users/{user}', [UserController::class, 'update'])->name('users.update');
// Route::delete('/users/{user}', [UserController::class, 'destroy'])->name('users.destroy');
// 限制资源路由
Route::resource('users', UserController::class)
->only(['index', 'show']);
// 排除某些路由
Route::resource('users', UserController::class)
->except(['create', 'edit']);
// API 资源路由(不包含 create 和 edit)
Route::apiResource('users', UserController::class);
// 嵌套资源路由
Route::resource('users.posts', PostController::class);
// routes/web.php - Web 路由配置
use App\Http\Controllers\UserController;
use App\Http\Controllers\PostController;
use App\Http\Controllers\HomeController;
use Illuminate\Support\Facades\Route;
// 首页路由
Route::get('/', [HomeController::class, 'index'])->name('home');
// 用户路由组
Route::prefix('users')->name('users.')->group(function () {
// 用户列表
Route::get('/', [UserController::class, 'index'])->name('index');
// 用户创建
Route::get('/create', [UserController::class, 'create'])->name('create');
// 用户保存
Route::post('/', [UserController::class, 'store'])->name('store');
// 用户详情
Route::get('/{user}', [UserController::class, 'show'])->name('show');
// 用户编辑
Route::get('/{user}/edit', [UserController::class, 'edit'])->name('edit');
// 用户更新
Route::put('/{user}', [UserController::class, 'update'])->name('update');
// 用户删除
Route::delete('/{user}', [UserController::class, 'destroy'])->name('destroy');
});
// 文章路由组(使用资源路由)
Route::resource('posts', PostController::class);
// API 路由
Route::prefix('api')->name('api.')->group(function () {
// 用户 API
Route::apiResource('users', UserController::class);
// 文章 API
Route::apiResource('posts', PostController::class);
});
// 认证路由(使用 Laravel Breeze 或 Jetstream)
Auth::routes();
// 使用 Artisan 命令创建控制器
php artisan make:controller UserController
// 创建资源控制器
php artisan make:controller UserController --resource
// 创建模型控制器
php artisan make:controller UserController --model=User
// 创建 API 控制器
php artisan make:controller Api/UserController --api
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class UserController extends Controller
{
// 用户列表
public function index()
{
$users = User::paginate(10);
return view('users.index', compact('users'));
}
// 用户详情
public function show($id)
{
$user = User::findOrFail($id);
return view('users.show', compact('user'));
}
// 创建用户表单
public function create()
{
return view('users.create');
}
// 保存用户
public function store(Request $request)
{
// 验证数据
$validated = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:6'
]);
// 创建用户
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email'],
'password' => bcrypt($validated['password'])
]);
return redirect()->route('users.show', $user->id)
->with('success', '用户创建成功');
}
// 编辑用户表单
public function edit($id)
{
$user = User::findOrFail($id);
return view('users.edit', compact('user'));
}
// 更新用户
public function update(Request $request, $id)
{
$user = User::findOrFail($id);
$validated = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users,email,' . $id
]);
$user->update($validated);
return redirect()->route('users.show', $user->id)
->with('success', '用户更新成功');
}
// 删除用户
public function destroy($id)
{
$user = User::findOrFail($id);
$user->delete();
return redirect()->route('users.index')
->with('success', '用户删除成功');
}
}
// app/Http/Controllers/ShowProfile.php
namespace App\Http\Controllers;
use App\Models\User;
class ShowProfile extends Controller
{
// 单一动作控制器
public function __invoke($id)
{
$user = User::findOrFail($id);
return view('users.profile', compact('user'));
}
}
// 路由定义
Route::get('/user/{id}', ShowProfile::class);
// 在控制器构造函数中应用中间件
public function __construct()
{
// 对所有方法应用中间件
$this->middleware('auth');
// 对特定方法应用中间件
$this->middleware('log')->only(['index', 'show']);
// 排除特定方法
$this->middleware('throttle:60,1')->except(['index']);
// 使用中间件组
$this->middleware(['auth', 'verified']);
}
// app/Http/Controllers/UserController.php - 用户控制器
namespace App\Http\Controllers;
use App\Models\User;
use App\Http\Requests\StoreUserRequest;
use App\Http\Requests\UpdateUserRequest;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class UserController extends Controller
{
// 构造函数:应用中间件
public function __construct()
{
// 对所有方法应用认证中间件
$this->middleware('auth');
// 对特定方法应用权限检查
$this->middleware('can:manage-users')->except(['index', 'show']);
}
// 用户列表:分页查询
public function index(Request $request): JsonResponse
{
// 获取分页和搜索参数
$page = $request->input('page', 1);
$limit = $request->input('limit', 10);
$keyword = $request->input('keyword', '');
// 构建查询
$query = User::query();
// 关键词搜索
if ($keyword) {
$query->where('name', 'like', '%' . $keyword . '%')
->orWhere('email', 'like', '%' . $keyword . '%');
}
// 分页查询
$users = $query->orderBy('id', 'desc')
->paginate($limit, ['*'], 'page', $page);
// 返回 JSON 响应
return response()->json([
'code' => 200,
'message' => 'success',
'data' => $users
]);
}
// 用户详情:显示单个用户信息
public function show($id): JsonResponse
{
// 查找用户,如果不存在则抛出 404 异常
$user = User::with(['posts', 'roles'])->findOrFail($id);
return response()->json([
'code' => 200,
'message' => 'success',
'data' => $user
]);
}
// 创建用户:使用表单请求验证
public function store(StoreUserRequest $request): JsonResponse
{
// 获取验证后的数据
$validated = $request->validated();
// 加密密码
$validated['password'] = bcrypt($validated['password']);
// 创建用户
$user = User::create($validated);
// 分配默认角色
$user->assignRole('user');
return response()->json([
'code' => 201,
'message' => '用户创建成功',
'data' => $user
], 201);
}
// 更新用户:使用表单请求验证
public function update(UpdateUserRequest $request, $id): JsonResponse
{
// 查找用户
$user = User::findOrFail($id);
// 获取验证后的数据
$validated = $request->validated();
// 如果提供了新密码,则加密
if (isset($validated['password'])) {
$validated['password'] = bcrypt($validated['password']);
}
// 更新用户
$user->update($validated);
return response()->json([
'code' => 200,
'message' => '用户更新成功',
'data' => $user
]);
}
// 删除用户
public function destroy($id): JsonResponse
{
// 查找用户
$user = User::findOrFail($id);
// 删除用户(软删除)
$user->delete();
return response()->json([
'code' => 200,
'message' => '用户删除成功'
]);
}
}
// 使用 Artisan 命令创建模型
php artisan make:model User
// 创建模型并生成迁移
php artisan make:model User --migration
// 创建模型、控制器和迁移
php artisan make:model User -mcr
// 创建 API 资源控制器
php artisan make:model User -a
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use HasFactory, SoftDeletes;
// 指定表名
protected $table = 'users';
// 指定主键
protected $primaryKey = 'id';
// 主键是否自增
public $incrementing = true;
// 主键类型
protected $keyType = 'int';
// 自动时间戳
public $timestamps = true;
// 时间戳格式
protected $dateFormat = 'U';
// 可批量赋值的属性
protected $fillable = ['name', 'email', 'password'];
// 不可批量赋值的属性
protected $guarded = ['id'];
// 隐藏属性
protected $hidden = ['password', 'remember_token'];
// 可见属性
protected $visible = ['id', 'name', 'email'];
// 属性类型转换
protected $casts = [
'email_verified_at' => 'datetime',
'is_admin' => 'boolean',
'settings' => 'array'
];
// 软删除字段
protected $dates = ['deleted_at'];
}
// 查询所有数据
$users = User::all();
// 查询单条数据
$user = User::find(1);
$user = User::findOrFail(1);
$user = User::where('id', 1)->first();
// 条件查询
$users = User::where('status', 1)->get();
$users = User::where('status', 1)->where('age', '>', 18)->get();
// 多条件查询
$users = User::where([
'status' => 1,
'type' => 1
])->get();
// 排序
$users = User::orderBy('id', 'desc')->get();
// 限制
$users = User::limit(10)->get();
// 分页
$users = User::paginate(10);
// 统计
$count = User::count();
$sum = User::where('status', 1)->sum('amount');
$avg = User::where('status', 1)->avg('score');
// 选择特定字段
$users = User::select('id', 'name', 'email')->get();
// 使用 chunk 处理大量数据
User::chunk(200, function ($users) {
foreach ($users as $user) {
// 处理用户
}
});
// 一对一关联
class User extends Model
{
// 用户档案
public function profile()
{
return $this->hasOne(Profile::class);
}
}
// 使用关联
$user = User::find(1);
$profile = $user->profile;
// 一对多关联
class User extends Model
{
// 用户文章
public function posts()
{
return $this->hasMany(Post::class);
}
}
// 使用关联
$user = User::find(1);
$posts = $user->posts;
// 多对多关联
class User extends Model
{
// 用户角色
public function roles()
{
return $this->belongsToMany(Role::class, 'user_role');
}
}
// 使用关联
$user = User::find(1);
$roles = $user->roles;
// 远程一对多关联
class Country extends Model
{
// 国家的所有文章
public function posts()
{
return $this->hasManyThrough(Post::class, User::class);
}
}
// 多态关联
class Post extends Model
{
// 评论
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}
// 预加载关联(解决 N+1 查询问题)
$users = User::with('posts')->get();
$users = User::with(['posts', 'roles'])->get();
$users = User::with('posts.comments')->get();
// 访问器:获取属性时自动调用
class User extends Model
{
// 获取全名
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
// 获取格式化的创建时间
public function getFormattedCreatedAtAttribute()
{
return $this->created_at->format('Y-m-d H:i:s');
}
}
// 使用访问器
$user = User::find(1);
echo $user->full_name;
echo $user->formatted_created_at;
// 修改器:设置属性时自动调用
class User extends Model
{
// 设置密码
public function setPasswordAttribute($value)
{
$this->attributes['password'] = bcrypt($value);
}
// 设置邮箱
public function setEmailAttribute($value)
{
$this->attributes['email'] = strtolower($value);
}
}
// 使用修改器
$user = new User();
$user->password = 'secret'; // 自动加密
$user->email = 'USER@EXAMPLE.COM'; // 自动转小写
$user->save();
// app/Models/User.php - 用户模型
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Model
{
use HasFactory, SoftDeletes, Notifiable, HasApiTokens;
// 可批量赋值的属性
protected $fillable = [
'name',
'email',
'password',
'phone',
'status',
'avatar'
];
// 隐藏属性
protected $hidden = [
'password',
'remember_token'
];
// 属性类型转换
protected $casts = [
'email_verified_at' => 'datetime',
'status' => 'boolean',
'settings' => 'array'
];
// 访问器:获取状态文本
public function getStatusTextAttribute(): string
{
return $this->status ? '启用' : '禁用';
}
// 访问器:获取头像 URL
public function getAvatarUrlAttribute(): string
{
if ($this->avatar) {
return asset('storage/' . $this->avatar);
}
return asset('images/default-avatar.png');
}
// 修改器:设置密码
public function setPasswordAttribute(string $value): void
{
$this->attributes['password'] = bcrypt($value);
}
// 修改器:设置邮箱
public function setEmailAttribute(string $value): void
{
$this->attributes['email'] = strtolower($value);
}
// 作用域:查询活跃用户
public function scopeActive($query)
{
return $query->where('status', true);
}
// 作用域:搜索用户
public function scopeSearch($query, $keyword)
{
return $query->where('name', 'like', '%' . $keyword . '%')
->orWhere('email', 'like', '%' . $keyword . '%');
}
// 关联:用户文章
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
// 关联:用户角色
public function roles(): BelongsToMany
{
return $this->belongsToMany(Role::class, 'user_role');
}
// 关联:用户评论
public function comments(): HasMany
{
return $this->hasMany(Comment::class);
}
// 检查用户是否有指定角色
public function hasRole(string $role): bool
{
return $this->roles()->where('name', $role)->exists();
}
// 分配角色
public function assignRole(string $role): void
{
$roleModel = Role::where('name', $role)->firstOrFail();
$this->roles()->attach($roleModel->id);
}
// 移除角色
public function removeRole(string $role): void
{
$roleModel = Role::where('name', $role)->firstOrFail();
$this->roles()->detach($roleModel->id);
}
}
// 渲染视图
return view('welcome');
// 传递数据到视图
return view('welcome', ['name' => 'John']);
// 使用 compact 函数
$name = 'John';
return view('welcome', compact('name'));
// 使用 with 方法
return view('welcome')->with('name', 'John');
// 共享数据到所有视图
// app/Providers/AppServiceProvider.php
public function boot()
{
View::share('currentUser', auth()->user());
}
// 输出变量
{{ $name }}
// 输出未转义的 HTML
{!! $html !!}
// 默认值
{{ $name ?? 'Guest' }}
// 三元运算符
{{ $name ? $name : 'Guest' }}
// 条件判断
@if ($status == 1)
启用
@elseif ($status == 0)
禁用
@else
未知
@endif
// 循环
@foreach ($users as $user)
{{ $user->name }}
@endforeach
// for 循环
@for ($i = 0; $i < 10; $i++)
{{ $i }}
@endfor
// while 循环
@while ($count > 0)
{{ $count }}
@php($count--)
@endwhile
// foreach 循环(带索引)
@foreach ($users as $index => $user)
{{ $index + 1 }}. {{ $user->name }}
@endforeach
// 检查变量是否存在
@isset($user)
{{ $user->name }}
@endisset
@empty($users)
没有用户
@endempty
// 布局模板:resources/views/layouts/app.blade.php
<!DOCTYPE html>
<html>
<head>
<title>@yield('title', 'Laravel')</title>
</head>
<body>
@yield('content')
</body>
</html>
// 子模板:resources/views/home.blade.php
@extends('layouts.app')
@section('title', '首页')
@section('content')
<h1>欢迎来到 Laravel</h1>
@endsection
// 创建组件
php artisan make:component Alert
// 使用组件
<x-alert type="success">
操作成功
</x-alert>
// 带槽位的组件
<x-card>
<x-slot:title>标题</x-slot>
<x-slot:footer>页脚</x-slot>
内容
</x-card>
// 内联组件
<x-button type="submit">提交</x-button>
// CSRF 令牌
@csrf
// 方法字段
@method('PUT')
// 包含子视图
@include('partials.header')
// 包含并传递数据
@include('partials.header', ['title' => '首页'])
// 条件包含
@includeWhen($isLogin, 'partials.user-menu')
@includeUnless($isLogin, 'partials.guest-menu')
// 包含第一个存在的视图
@includeFirst(['partials.custom-header', 'partials.header'])
// 循环包含
@foreach ($users as $user)
@include('partials.user-card', ['user' => $user])
@endforeach
// 验证错误显示
@error('email')
{{ $message }}
@enderror
// 认证检查
@auth
已登录
@endauth
@guest
未登录
@endguest
// resources/views/layouts/app.blade.php - 布局模板
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@yield('title', 'Laravel')</title>
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
@stack('styles')
</head>
<body>
@include('partials.header')
<main class="container">
@yield('content')
</main>
@include('partials.footer')
<script src="{{ asset('js/app.js') }}"></script>
@stack('scripts')
</body>
</html>
// resources/views/users/index.blade.php - 用户列表视图
@extends('layouts.app')
@section('title', '用户列表')
@section('content')
<div class="page-header">
<h1>用户列表</h1>
<a href="{{ route('users.create') }}" class="btn btn-primary">添加用户</a>
</div>
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>邮箱</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
@foreach($users as $user)
<tr>
<td>{{ $user->id }}</td>
<td>{{ $user->name }}</td>
<td>{{ $user->email }}</td>
<td>
@if($user->status)
<span class="badge badge-success">启用</span>
@else
<span class="badge badge-danger">禁用</span>
@endif
</td>
<td>
<a href="{{ route('users.show', $user) }}">查看</a>
<a href="{{ route('users.edit', $user) }}">编辑</a>
<form action="{{ route('users.destroy', $user) }}" method="POST">
@csrf
@method('DELETE')
<button type="submit">删除</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
{{ $users->links() }}
@endsection
// config/database.php - 数据库配置
return [
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
],
];
// 创建迁移
php artisan make:migration create_users_table
// 运行迁移
php artisan migrate
// 回滚迁移
php artisan migrate:rollback
// 回滚所有迁移
php artisan migrate:reset
// 回滚并重新运行所有迁移
php artisan migrate:refresh
// 删除所有表并重新运行迁移
php artisan migrate:fresh
// 迁移文件示例
// database/migrations/2024_01_01_000000_create_users_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
// 创建表
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
$table->softDeletes();
});
}
// 删除表
public function down()
{
Schema::dropIfExists('users');
}
};
// 使用查询构建器
use Illuminate\Support\Facades\DB;
// 查询数据
$users = DB::table('users')->get();
$user = DB::table('users')->where('id', 1)->first();
// 插入数据
$id = DB::table('users')->insertGetId([
'name' => '张三',
'email' => 'zhangsan@example.com',
'password' => bcrypt('password')
]);
// 更新数据
DB::table('users')->where('id', 1)->update([
'name' => '李四'
]);
// 删除数据
DB::table('users')->where('id', 1)->delete();
// 链式查询
$users = DB::table('users')
->where('status', 1)
->where('age', '>', 18)
->orderBy('id', 'desc')
->limit(10)
->get();
// 聚合查询
$count = DB::table('users')->count();
$sum = DB::table('orders')->sum('amount');
$avg = DB::table('orders')->avg('amount');
$max = DB::table('orders')->max('amount');
$min = DB::table('orders')->min('amount');
// 分组查询
$users = DB::table('users')
->select('role', DB::raw('COUNT(*) as count'))
->groupBy('role')
->get();
// 连接查询
$users = DB::table('users')
->join('posts', 'users.id', '=', 'posts.user_id')
->select('users.*', 'posts.title as post_title')
->get();
// 左连接
$users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
// 手动事务
DB::beginTransaction();
try {
DB::table('users')->where('id', 1)->decrement('balance', 100);
DB::table('users')->where('id', 2)->increment('balance', 100);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
// 闭包事务
DB::transaction(function () {
DB::table('users')->where('id', 1)->decrement('balance', 100);
DB::table('users')->where('id', 2)->increment('balance', 100);
});
// 指定重试次数
DB::transaction(function () {
// 数据库操作
}, 3);
// app/Services/UserService.php - 用户服务
namespace App\Services;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use App\Models\User;
class UserService
{
// 获取用户列表:分页查询
public function getUserList(int $page = 1, int $limit = 10, string $keyword = '')
{
$query = User::query();
// 关键词搜索
if ($keyword) {
$query->where('name', 'like', '%' . $keyword . '%')
->orWhere('email', 'like', '%' . $keyword . '%');
}
// 分页查询
$result = $query->orderBy('id', 'desc')
->paginate($limit, ['*'], 'page', $page);
return $result;
}
// 获取用户详情
public function getUserDetail(int $id)
{
$user = User::with(['posts', 'roles'])->find($id);
if (!$user) {
throw new \Exception('用户不存在');
}
return $user;
}
// 创建用户:使用事务
public function createUser(array $data)
{
return DB::transaction(function () use ($data) {
// 检查邮箱是否已存在
$exists = User::where('email', $data['email'])->exists();
if ($exists) {
throw new \Exception('邮箱已存在');
}
// 创建用户
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'phone' => $data['phone'] ?? null,
'status' => true
]);
// 记录日志
Log::info('用户创建成功', [
'user_id' => $user->id,
'name' => $user->name
]);
return $user;
});
}
// 更新用户
public function updateUser(int $id, array $data)
{
$user = User::find($id);
if (!$user) {
throw new \Exception('用户不存在');
}
// 检查邮箱是否被其他用户使用
if (isset($data['email']) && $data['email'] != $user->email) {
$exists = User::where('email', $data['email'])
->where('id', '<>', $id)
->exists();
if ($exists) {
throw new \Exception('邮箱已被使用');
}
}
// 更新用户
$user->update($data);
return $user;
}
// 删除用户:软删除
public function deleteUser(int $id)
{
$user = User::find($id);
if (!$user) {
throw new \Exception('用户不存在');
}
// 软删除
$user->delete();
return true;
}
// 转账:使用事务确保数据一致性
public function transfer(int $fromId, int $toId, float $amount)
{
return DB::transaction(function () use ($fromId, $toId, $amount) {
// 检查发送方余额
$fromUser = User::where('id', $fromId)
->lockForUpdate()
->first();
if (!$fromUser || $fromUser->balance < $amount) {
throw new \Exception('余额不足');
}
// 检查接收方是否存在
$toUser = User::find($toId);
if (!$toUser) {
throw new \Exception('接收方不存在');
}
// 扣减发送方余额
$fromUser->decrement('balance', $amount);
// 增加接收方余额
$toUser->increment('balance', $amount);
// 记录转账日志
DB::table('transfer_logs')->insert([
'from_id' => $fromId,
'to_id' => $toId,
'amount' => $amount,
'created_at' => now()
]);
return true;
});
}
}
// 创建中间件
php artisan make:middleware Auth
// app/Http/Middleware/Auth.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class Auth
{
// 处理请求
public function handle(Request $request, Closure $next)
{
// 检查用户是否登录
if (!auth()->check()) {
return redirect('/login');
}
// 继续执行
return $next($request);
}
}
// app/Http/Kernel.php - 注册中间件
protected $middleware = [
// 全局中间件
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
// 在路由中使用中间件
Route::get('/admin', [AdminController::class, 'index'])
->middleware('auth');
// 使用多个中间件
Route::get('/admin', [AdminController::class, 'index'])
->middleware(['auth', 'admin']);
// 使用中间件组
Route::middleware(['web'])->group(function () {
Route::get('/', [HomeController::class, 'index']);
Route::get('/about', [HomeController::class, 'about']);
});
// 在控制器中使用中间件
public function __construct()
{
$this->middleware('auth');
$this->middleware('admin')->only(['create', 'store']);
$this->middleware('log')->except(['index', 'show']);
}
// 带参数的中间件
Route::get('/admin', [AdminController::class, 'index'])
->middleware('role:admin');
// app/Http/Middleware/CheckRole.php
public function handle(Request $request, Closure $next, $role)
{
if (!$request->user()->hasRole($role)) {
abort(403);
}
return $next($request);
}
// app/Http/Middleware/ApiAuth.php - API 认证中间件
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ApiAuth
{
// 处理请求
public function handle(Request $request, Closure $next)
{
// 检查用户是否认证
if (!Auth::guard('api')->check()) {
return response()->json([
'code' => 401,
'message' => '未授权'
], 401);
}
// 继续执行
return $next($request);
}
}
// app/Http/Middleware/LogRequest.php - 请求日志中间件
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class LogRequest
{
// 处理请求
public function handle(Request $request, Closure $next)
{
// 记录请求开始时间
$startTime = microtime(true);
// 继续执行
$response = $next($request);
// 计算执行时间
$executeTime = microtime(true) - $startTime;
// 记录日志
Log::info('请求日志', [
'url' => $request->url(),
'method' => $request->method(),
'ip' => $request->ip(),
'user_id' => auth()->id(),
'execute_time' => $executeTime,
'response_code' => $response->getStatusCode()
]);
return $response;
}
}
// app/Http/Middleware/Cors.php - 跨域中间件
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class Cors
{
// 处理请求
public function handle(Request $request, Closure $next)
{
// 继续执行
$response = $next($request);
// 设置跨域头
$response->headers->set('Access-Control-Allow-Origin', '*');
$response->headers->set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
$response->headers->set('Access-Control-Max-Age', '86400');
// 处理预检请求
if ($request->isMethod('OPTIONS')) {
return response('', 200);
}
return $response;
}
}
// 在控制器中验证
public function store(Request $request)
{
// 验证数据
$validated = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:6|confirmed'
]);
// 验证通过,继续处理
User::create($validated);
return redirect()->back()->with('success', '用户创建成功');
}
// 手动创建验证器
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:6'
]);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
// 验证通过
User::create($request->all());
return redirect()->back()->with('success', '用户创建成功');
}
// 创建表单请求
php artisan make:request StoreUserRequest
// app/Http/Requests/StoreUserRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
class StoreUserRequest extends FormRequest
{
// 确定用户是否有权限进行此请求
public function authorize()
{
return true;
}
// 获取验证规则
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|string|min:6|confirmed',
'phone' => 'nullable|string|max:20',
'status' => 'nullable|boolean'
];
}
// 自定义错误消息
public function messages()
{
return [
'name.required' => '姓名不能为空',
'name.max' => '姓名最多255个字符',
'email.required' => '邮箱不能为空',
'email.email' => '邮箱格式不正确',
'email.unique' => '邮箱已存在',
'password.required' => '密码不能为空',
'password.min' => '密码至少6个字符',
'password.confirmed' => '两次密码不一致'
];
}
// 自定义验证属性名称
public function attributes()
{
return [
'name' => '姓名',
'email' => '邮箱',
'password' => '密码'
];
}
// 验证失败处理
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(
response()->json([
'code' => 422,
'message' => '验证失败',
'errors' => $validator->errors()
], 422)
);
}
}
// 在 AppServiceProvider 中注册自定义验证规则
// app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
// 自定义验证规则:手机号
Validator::extend('mobile', function ($attribute, $value, $parameters, $validator) {
return preg_match('/^1[3-9]\d{9}$/', $value);
});
// 自定义验证规则:身份证号
Validator::extend('id_card', function ($attribute, $value, $parameters, $validator) {
return preg_match('/^\d{17}[\dXx]$/', $value);
});
// 自定义验证规则:密码强度
Validator::extend('strong_password', function ($attribute, $value, $parameters, $validator) {
return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/', $value);
});
}
}
// app/Http/Requests/StoreUserRequest.php - 创建用户表单请求
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
class StoreUserRequest extends FormRequest
{
// 确定用户是否有权限进行此请求
public function authorize(): bool
{
return true;
}
// 获取验证规则
public function rules(): array
{
return [
// 用户名规则
'username' => 'required|string|alpha_num|min:4|max:20|unique:users',
// 密码规则
'password' => 'required|string|min:6|max:20|confirmed',
'password_confirmation' => 'required|string|min:6|max:20',
// 邮箱规则
'email' => 'required|email|unique:users',
// 手机号规则
'mobile' => 'required|string|mobile|unique:users',
// 年龄规则
'age' => 'nullable|integer|between:18,60',
// 性别规则
'gender' => 'nullable|integer|in:0,1,2',
// 状态规则
'status' => 'nullable|boolean'
];
}
// 自定义错误消息
public function messages(): array
{
return [
'username.required' => '用户名不能为空',
'username.alpha_num' => '用户名只能是字母和数字',
'username.min' => '用户名至少4个字符',
'username.max' => '用户名最多20个字符',
'username.unique' => '用户名已存在',
'password.required' => '密码不能为空',
'password.min' => '密码至少6个字符',
'password.max' => '密码最多20个字符',
'password.confirmed' => '两次密码不一致',
'password_confirmation.required' => '确认密码不能为空',
'email.required' => '邮箱不能为空',
'email.email' => '邮箱格式不正确',
'email.unique' => '邮箱已存在',
'mobile.required' => '手机号不能为空',
'mobile.mobile' => '手机号格式不正确',
'mobile.unique' => '手机号已存在',
'age.integer' => '年龄必须是整数',
'age.between' => '年龄必须在18-60之间',
'gender.in' => '性别值不正确',
'status.boolean' => '状态值不正确'
];
}
// 自定义验证属性名称
public function attributes(): array
{
return [
'username' => '用户名',
'password' => '密码',
'password_confirmation' => '确认密码',
'email' => '邮箱',
'mobile' => '手机号',
'age' => '年龄',
'gender' => '性别',
'status' => '状态'
];
}
// 验证失败处理
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(
response()->json([
'code' => 422,
'message' => '验证失败',
'errors' => $validator->errors()
], 422)
);
}
}
// app/Http/Controllers/UserController.php - 用户控制器
namespace App\Http\Controllers;
use App\Models\User;
use App\Http\Requests\StoreUserRequest;
use App\Http\Requests\UpdateUserRequest;
use Illuminate\Http\Request;
class UserController extends Controller
{
// 构造函数:应用中间件
public function __construct()
{
$this->middleware('auth');
$this->middleware('can:manage-users')->except(['index', 'show']);
}
// 用户列表
public function index(Request $request)
{
$page = $request->input('page', 1);
$limit = $request->input('limit', 10);
$keyword = $request->input('keyword', '');
$query = User::query();
if ($keyword) {
$query->where('name', 'like', '%' . $keyword . '%')
->orWhere('email', 'like', '%' . $keyword . '%');
}
$users = $query->orderBy('id', 'desc')
->paginate($limit, ['*'], 'page', $page);
return response()->json([
'code' => 200,
'message' => 'success',
'data' => $users
]);
}
// 用户详情
public function show($id)
{
$user = User::with(['posts', 'roles'])->findOrFail($id);
return response()->json([
'code' => 200,
'message' => 'success',
'data' => $user
]);
}
// 创建用户
public function store(StoreUserRequest $request)
{
$validated = $request->validated();
$validated['password'] = bcrypt($validated['password']);
$user = User::create($validated);
$user->assignRole('user');
return response()->json([
'code' => 201,
'message' => '用户创建成功',
'data' => $user
], 201);
}
// 更新用户
public function update(UpdateUserRequest $request, $id)
{
$user = User::findOrFail($id);
$validated = $request->validated();
if (isset($validated['password'])) {
$validated['password'] = bcrypt($validated['password']);
}
$user->update($validated);
return response()->json([
'code' => 200,
'message' => '用户更新成功',
'data' => $user
]);
}
// 删除用户
public function destroy($id)
{
$user = User::findOrFail($id);
$user->delete();
return response()->json([
'code' => 200,
'message' => '用户删除成功'
]);
}
}
本指南涵盖了 Laravel 的核心概念和技术,包括:
通过本指南的学习,您应该能够掌握 Laravel 的基本概念和核心特性,为后端开发打下坚实的基础。
Laravel 是一个功能强大且优雅的 PHP 框架,它通过优雅的语法、强大的 ORM、丰富的功能组件和完善的文档,帮助开发者快速构建高质量的 Web 应用。随着 Laravel 的不断发展,它已经成为全球最受欢迎的 PHP 框架之一。