资源控制器 #
一、RESTful概述 #
1.1 什么是RESTful #
RESTful是一种软件架构风格,用于设计网络应用程序的API。它使用HTTP动词来表示操作类型。
text
RESTful设计原则
├── 使用HTTP动词表示操作
│ ├── GET - 获取资源
│ ├── POST - 创建资源
│ ├── PUT/PATCH - 更新资源
│ └── DELETE - 删除资源
├── 使用名词表示资源
│ ├── /users - 用户资源
│ ├── /posts - 文章资源
│ └── /comments - 评论资源
└── 使用HTTP状态码表示结果
├── 200 - 成功
├── 201 - 创建成功
├── 404 - 未找到
└── 500 - 服务器错误
1.2 RESTful路由设计 #
| HTTP方法 | URI | 操作 | 说明 |
|---|---|---|---|
| GET | /users | index | 获取用户列表 |
| GET | /users/create | create | 显示创建表单 |
| POST | /users | store | 保存新用户 |
| GET | /users/ | show | 显示单个用户 |
| GET | /users/{id}/edit | edit | 显示编辑表单 |
| PUT/PATCH | /users/ | update | 更新用户 |
| DELETE | /users/ | destroy | 删除用户 |
二、创建资源控制器 #
2.1 创建命令 #
bash
php artisan make:controller UserController --resource
2.2 生成的控制器 #
php
// 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 create()
{
return view('users.create');
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8',
]);
$user = User::create($validated);
return redirect()->route('users.show', $user)
->with('success', '用户创建成功');
}
public function show(User $user)
{
return view('users.show', compact('user'));
}
public function edit(User $user)
{
return view('users.edit', compact('user'));
}
public function update(Request $request, User $user)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,' . $user->id,
]);
$user->update($validated);
return redirect()->route('users.show', $user)
->with('success', '用户更新成功');
}
public function destroy(User $user)
{
$user->delete();
return redirect()->route('users.index')
->with('success', '用户删除成功');
}
}
三、资源路由 #
3.1 定义资源路由 #
php
// routes/web.php
use App\Http\Controllers\UserController;
Route::resource('users', UserController::class);
3.2 生成的路由列表 #
bash
php artisan route:list --path=users
输出:
text
+----------+------------------------+-----------------+------------------------+
| Method | URI | Name | Action |
+----------+------------------------+-----------------+------------------------+
| GET | users | users.index | UserController@index |
| GET | users/create | users.create | UserController@create |
| POST | users | users.store | UserController@store |
| GET | users/{user} | users.show | UserController@show |
| GET | users/{user}/edit | users.edit | UserController@edit |
| PUT | users/{user} | users.update | UserController@update |
| PATCH | users/{user} | users.update | UserController@update |
| DELETE | users/{user} | users.destroy | UserController@destroy |
+----------+------------------------+-----------------+------------------------+
3.3 部分资源路由 #
php
// 只包含指定方法
Route::resource('users', UserController::class)->only([
'index', 'show'
]);
// 排除指定方法
Route::resource('users', UserController::class)->except([
'create', 'store', 'destroy'
]);
3.4 资源路由命名 #
php
Route::resource('users', UserController::class)->names([
'index' => 'users.list',
'show' => 'users.detail',
]);
3.5 资源路由参数 #
php
Route::resource('users', UserController::class)->parameters([
'users' => 'user_id',
]);
四、API资源控制器 #
4.1 创建API资源控制器 #
bash
php artisan make:controller UserController --api
4.2 API资源控制器结构 #
php
class UserController extends Controller
{
public function index()
{
return User::all();
}
public function store(Request $request)
{
$user = User::create($request->validated());
return response()->json($user, 201);
}
public function show(User $user)
{
return $user;
}
public function update(Request $request, User $user)
{
$user->update($request->validated());
return response()->json($user);
}
public function destroy(User $user)
{
$user->delete();
return response()->json(null, 204);
}
}
4.3 API资源路由 #
php
Route::apiResource('users', UserController::class);
生成的路由:
| 方法 | URI | 名称 | 动作 |
|---|---|---|---|
| GET | /users | users.index | index |
| POST | /users | users.store | store |
| GET | /users/ | users.show | show |
| PUT/PATCH | /users/ | users.update | update |
| DELETE | /users/ | users.destroy | destroy |
4.4 批量API资源 #
php
Route::apiResources([
'users' => UserController::class,
'posts' => PostController::class,
'comments' => CommentController::class,
]);
五、嵌套资源 #
5.1 嵌套资源路由 #
php
// 用户下的文章
Route::resource('users.posts', PostController::class);
生成的路由:
| 方法 | URI | 名称 |
|---|---|---|
| GET | /users/{user}/posts | users.posts.index |
| GET | /users/{user}/posts/create | users.posts.create |
| POST | /users/{user}/posts | users.posts.store |
| GET | /users/{user}/posts/ | users.posts.show |
| GET | /users/{user}/posts/{post}/edit | users.posts.edit |
| PUT/PATCH | /users/{user}/posts/ | users.posts.update |
| DELETE | /users/{user}/posts/ | users.posts.destroy |
5.2 嵌套控制器 #
php
class PostController extends Controller
{
public function index(User $user)
{
return $user->posts;
}
public function show(User $user, Post $post)
{
return $post;
}
public function store(Request $request, User $user)
{
$post = $user->posts()->create($request->validated());
return redirect()->route('users.posts.show', [$user, $post]);
}
}
5.3 浅层嵌套 #
php
Route::resource('users.posts', PostController::class)->shallow();
生成的路由:
| 方法 | URI | 名称 |
|---|---|---|
| GET | /users/{user}/posts | users.posts.index |
| GET | /posts/create | posts.create |
| POST | /users/{user}/posts | users.posts.store |
| GET | /posts/ | posts.show |
| GET | /posts/{post}/edit | posts.edit |
| PUT/PATCH | /posts/ | posts.update |
| DELETE | /posts/ | posts.destroy |
六、资源模型绑定 #
6.1 创建带模型的资源控制器 #
bash
php artisan make:controller UserController --resource --model=User
6.2 生成的控制器 #
php
class UserController extends Controller
{
public function show(User $user)
{
return view('users.show', compact('user'));
}
public function edit(User $user)
{
return view('users.edit', compact('user'));
}
public function update(Request $request, User $user)
{
$user->update($request->validated());
return redirect()->route('users.show', $user);
}
public function destroy(User $user)
{
$user->delete();
return redirect()->route('users.index');
}
}
七、资源控制器中间件 #
7.1 资源路由中间件 #
php
Route::resource('users', UserController::class)
->middleware(['auth', 'verified']);
7.2 控制器构造函数 #
php
class UserController extends Controller
{
public function __construct()
{
$this->middleware('auth');
$this->middleware('admin')->except(['index', 'show']);
}
}
八、完整示例 #
8.1 创建控制器 #
bash
php artisan make:controller PostController --resource --model=Post
8.2 完整控制器实现 #
php
// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function __construct()
{
$this->middleware('auth')->except(['index', 'show']);
}
public function index()
{
$posts = Post::with('user')
->published()
->latest()
->paginate(10);
return view('posts.index', compact('posts'));
}
public function create()
{
return view('posts.create');
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
'status' => 'required|in:draft,published',
]);
$post = auth()->user()->posts()->create($validated);
return redirect()->route('posts.show', $post)
->with('success', '文章创建成功');
}
public function show(Post $post)
{
$post->load(['user', 'comments.user']);
return view('posts.show', compact('post'));
}
public function edit(Post $post)
{
$this->authorize('update', $post);
return view('posts.edit', compact('post'));
}
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
'status' => 'required|in:draft,published',
]);
$post->update($validated);
return redirect()->route('posts.show', $post)
->with('success', '文章更新成功');
}
public function destroy(Post $post)
{
$this->authorize('delete', $post);
$post->delete();
return redirect()->route('posts.index')
->with('success', '文章删除成功');
}
}
8.3 路由定义 #
php
// routes/web.php
use App\Http\Controllers\PostController;
Route::resource('posts', PostController::class);
九、资源控制器最佳实践 #
9.1 使用表单请求 #
php
// 创建表单请求
php artisan make:request StorePostRequest
// 表单请求类
class StorePostRequest extends FormRequest
{
public function rules()
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
'status' => 'required|in:draft,published',
];
}
}
// 控制器中使用
public function store(StorePostRequest $request)
{
$post = auth()->user()->posts()->create($request->validated());
return redirect()->route('posts.show', $post);
}
9.2 使用API资源 #
php
// 创建API资源
php artisan make:resource UserResource
// 资源类
class UserResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at->toIso8601String(),
];
}
}
// 控制器中使用
public function index()
{
$users = User::paginate(10);
return UserResource::collection($users);
}
9.3 使用策略授权 #
php
// 创建策略
php artisan make:policy PostPolicy --model=Post
// 策略类
class PostPolicy
{
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
public function delete(User $user, Post $post)
{
return $user->id === $post->user_id || $user->isAdmin();
}
}
// 控制器中使用
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
// ...
}
十、总结 #
10.1 核心要点 #
| 要点 | 命令/方法 |
|---|---|
| 创建资源控制器 | php artisan make:controller X --resource |
| 定义资源路由 | Route::resource('users', UserController::class) |
| API资源路由 | Route::apiResource('users', UserController::class) |
| 部分资源 | only() / except() |
| 嵌套资源 | Route::resource('users.posts', ...) |
10.2 下一步 #
掌握了资源控制器后,让我们继续学习 依赖注入,了解Laravel强大的IoC容器!
最后更新:2026-03-28