控制器基础 #
一、控制器概述 #
1.1 什么是控制器 #
控制器是MVC架构中的C,负责处理用户请求、调用业务逻辑并返回响应。
text
请求处理流程
┌─────────────┐
│ 用户请求 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 路由 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 控制器 │
│ 处理请求 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 返回响应 │
└─────────────┘
1.2 控制器位置 #
控制器存放在 app/Http/Controllers 目录下。
二、创建控制器 #
2.1 使用Artisan命令 #
bash
# 创建基础控制器
php artisan make:controller UserController
# 创建资源控制器
php artisan make:controller UserController --resource
# 创建API资源控制器
php artisan make:controller UserController --api
# 创建单动作控制器
php artisan make:controller ShowProfile --invokable
# 指定模型
php artisan make:controller UserController --model=User
2.2 控制器结构 #
php
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
return '用户列表';
}
}
2.3 基础控制器 #
Laravel提供了一个基础控制器 App\Http\Controllers\Controller:
php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, ValidatesRequests;
}
三、定义路由 #
3.1 基本路由 #
php
// routes/web.php
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
3.2 多个路由 #
php
Route::get('/users', [UserController::class, 'index']);
Route::get('/users/{id}', [UserController::class, 'show']);
Route::post('/users', [UserController::class, 'store']);
Route::put('/users/{id}', [UserController::class, 'update']);
Route::delete('/users/{id}', [UserController::class, 'destroy']);
3.3 控制器路由组 #
php
Route::controller(UserController::class)->group(function () {
Route::get('/users', 'index');
Route::get('/users/{id}', 'show');
Route::post('/users', 'store');
});
四、控制器方法 #
4.1 接收参数 #
php
class UserController extends Controller
{
public function show($id)
{
return "用户ID: {$id}";
}
public function posts($userId, $postId)
{
return "用户 {$userId} 的文章 {$postId}";
}
}
4.2 类型提示参数 #
php
use App\Models\User;
class UserController extends Controller
{
public function show(User $user)
{
return $user;
}
}
4.3 接收Request对象 #
php
use Illuminate\Http\Request;
class UserController extends Controller
{
public function store(Request $request)
{
$name = $request->input('name');
$email = $request->input('email');
return response()->json([
'name' => $name,
'email' => $email,
]);
}
}
4.4 依赖注入 #
php
use App\Services\UserService;
class UserController extends Controller
{
protected $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
public function index()
{
$users = $this->userService->getAll();
return view('users.index', compact('users'));
}
}
五、返回响应 #
5.1 返回字符串 #
php
public function index()
{
return 'Hello, Laravel!';
}
5.2 返回数组 #
php
public function index()
{
return ['name' => 'John', 'email' => 'john@example.com'];
}
5.3 返回视图 #
php
public function index()
{
return view('users.index');
}
public function show($id)
{
$user = User::find($id);
return view('users.show', compact('user'));
}
5.4 返回JSON响应 #
php
public function api()
{
return response()->json([
'status' => 'success',
'data' => ['name' => 'John'],
]);
}
5.5 返回重定向 #
php
public function store()
{
return redirect('/users');
}
public function update($id)
{
return redirect()->route('users.show', $id);
}
public function back()
{
return back();
}
public function home()
{
return redirect()->home();
}
5.6 返回下载响应 #
php
public function download()
{
return response()->download(public_path('file.pdf'));
}
public function downloadWithName()
{
return response()->download(
public_path('file.pdf'),
'document.pdf'
);
}
5.7 返回文件 #
php
public function file()
{
return response()->file(public_path('image.jpg'));
}
六、单动作控制器 #
6.1 创建单动作控制器 #
bash
php artisan make:controller ShowProfile --invokable
6.2 实现__invoke方法 #
php
// app/Http/Controllers/ShowProfile.php
namespace App\Http\Controllers;
class ShowProfile
{
public function __invoke($id)
{
return "用户 {$id} 的资料";
}
}
6.3 路由定义 #
php
Route::get('/profile/{id}', ShowProfile::class);
七、控制器中间件 #
7.1 构造函数中定义 #
php
class UserController extends Controller
{
public function __construct()
{
$this->middleware('auth');
$this->middleware('admin')->only(['create', 'store', 'destroy']);
$this->middleware('verified')->except('index');
}
}
7.2 闭包中间件 #
php
public function __construct()
{
$this->middleware(function ($request, $next) {
if ($request->user()->isAdmin()) {
return $next($request);
}
abort(403);
});
}
八、资源控制器 #
8.1 创建资源控制器 #
bash
php artisan make:controller UserController --resource
8.2 生成的控制器方法 #
php
class UserController extends Controller
{
public function index() // 列表
public function create() // 创建表单
public function store() // 保存
public function show($id) // 详情
public function edit($id) // 编辑表单
public function update($id) // 更新
public function destroy($id) // 删除
}
8.3 资源路由 #
php
Route::resource('users', UserController::class);
生成的路由:
| 方法 | URI | 名称 | 动作 |
|---|---|---|---|
| GET | /users | users.index | index |
| GET | /users/create | users.create | create |
| POST | /users | users.store | store |
| GET | /users/ | users.show | show |
| GET | /users/{user}/edit | users.edit | edit |
| PUT/PATCH | /users/ | users.update | update |
| DELETE | /users/ | users.destroy | destroy |
8.4 部分资源路由 #
php
// 只包含指定方法
Route::resource('users', UserController::class)->only([
'index', 'show'
]);
// 排除指定方法
Route::resource('users', UserController::class)->except([
'create', 'store', 'destroy'
]);
九、API资源控制器 #
9.1 创建API资源控制器 #
bash
php artisan make:controller UserController --api
9.2 生成的控制器方法 #
php
class UserController extends Controller
{
public function index() // 列表
public function store() // 保存
public function show($id) // 详情
public function update($id) // 更新
public function destroy($id) // 删除
}
9.3 API资源路由 #
php
Route::apiResource('users', UserController::class);
十、嵌套资源 #
10.1 嵌套资源路由 #
php
Route::resource('users.posts', PostController::class);
生成的路由:
| 方法 | URI | 名称 |
|---|---|---|
| GET | /users/{user}/posts | users.posts.index |
| GET | /users/{user}/posts/ | users.posts.show |
| POST | /users/{user}/posts | users.posts.store |
| PUT/PATCH | /users/{user}/posts/ | users.posts.update |
| DELETE | /users/{user}/posts/ | users.posts.destroy |
10.2 浅层嵌套 #
php
Route::resource('users.posts', PostController::class)->shallow();
生成的路由:
| 方法 | URI | 名称 |
|---|---|---|
| GET | /users/{user}/posts | users.posts.index |
| GET | /posts/ | posts.show |
| POST | /users/{user}/posts | users.posts.store |
| PUT/PATCH | /posts/ | posts.update |
| DELETE | /posts/ | posts.destroy |
十一、控制器命名规范 #
11.1 命名约定 #
| 类型 | 命名规范 | 示例 |
|---|---|---|
| 控制器 | PascalCase + Controller | UserController |
| 方法 | camelCase | index, show, store |
| 资源 | 复数形式 | users, posts |
11.2 目录组织 #
text
app/Http/Controllers/
├── Controller.php
├── UserController.php
├── PostController.php
└── Admin/
├── DashboardController.php
└── UserController.php
十二、最佳实践 #
12.1 保持控制器精简 #
php
// 不推荐:业务逻辑在控制器中
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
]);
$user = User::create($validated);
Mail::to($user)->send(new WelcomeEmail($user));
event(new UserRegistered($user));
return redirect()->route('users.show', $user);
}
// 推荐:使用服务类
public function store(StoreUserRequest $request, UserService $userService)
{
$user = $userService->create($request->validated());
return redirect()->route('users.show', $user);
}
12.2 使用表单请求验证 #
php
// 控制器
public function store(StoreUserRequest $request)
{
$user = User::create($request->validated());
return redirect()->route('users.show', $user);
}
// 表单请求
class StoreUserRequest extends FormRequest
{
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
];
}
}
12.3 使用资源响应 #
php
public function index()
{
$users = User::paginate(10);
return UserResource::collection($users);
}
public function show(User $user)
{
return new UserResource($user);
}
十三、总结 #
13.1 核心要点 #
| 要点 | 说明 |
|---|---|
| 创建 | php artisan make:controller |
| 路由 | Route::get('/url', [Controller::class, 'method']) |
| 响应 | view、json、redirect、download |
| 中间件 | 构造函数中定义 |
| 资源控制器 | RESTful CRUD操作 |
13.2 下一步 #
掌握了控制器基础后,让我们继续学习 资源控制器,深入了解RESTful资源操作!
最后更新:2026-03-28