本文目录导读:

在 PHP 项目中,控制器分层设计是保持代码清晰、可维护和可测试的关键,以下是几种常见的控制器拆分策略:
基础分层架构
常见分层结构:
Controllers/
├── Web/ # 前端页面控制器
│ ├── UserController.php
│ └── ProductController.php
├── Api/ # API接口控制器
│ ├── UserController.php
│ └── ProductController.php
├── Admin/ # 后台管理控制器
│ ├── UserController.php
│ └── ProductController.php
└── Console/ # 命令行控制器
└── TaskController.php
控制器内部拆分方法
按功能职责拆分
// 原始臃肿控制器
class UserController extends Controller
{
public function store() { /* 创建用户 */ }
public function update() { /* 更新用户 */ }
public function login() { /* 用户登录 */ }
public function register() { /* 用户注册 */ }
public function verifyEmail() { /* 验证邮箱 */ }
public function forgotPassword() { /* 忘记密码 */ }
}
// 拆分后
Controllers/
├── User/
│ ├── UserController.php # 基本CRUD
│ ├── AuthController.php # 认证相关
│ ├── EmailController.php # 邮箱操作
│ └── PasswordController.php # 密码操作
业务模块拆分
// 订单系统拆分 Controllers/ ├── Order/ │ ├── OrderController.php # 订单CRUD │ ├── OrderStatusController.php # 状态管理 │ ├── OrderRefundController.php # 退款处理 │ └── OrderShipController.php # 物流管理
实用拆分模式
1 动作角色拆分
// 文件系统管理 Controllers/ ├── File/ │ ├── FileUploadController.php # 上传操作 │ ├── FileDownloadController.php # 下载操作 │ ├── FileDeleteController.php # 删除操作 │ └── FileShareController.php # 分享操作
2 数据维度拆分
// 用户数据管理 Controllers/ ├── User/ │ ├── UserProfileController.php # 个人信息 │ ├── UserSettingController.php # 系统设置 │ ├── UserNotifyController.php # 通知设置 │ └── UserSecurityController.php # 安全设置
代码示例
拆分前的问题代码:
class OrderController extends Controller
{
public function create() { /* ... */ }
public function cancel() { /* ... */ }
public function refund() { /* ... */ }
public function pay() { /* ... */ }
public function ship() { /* ... */ }
public function confirm() { /* ... */ }
// 30+ 方法...
}
拆分后的整洁代码:
OrderController.php
class OrderController extends Controller
{
public function index() { /* 订单列表 */ }
public function show($id) { /* 订单详情 */ }
public function create() { /* 创建订单 */ }
public function update($id) { /* 更新订单 */ }
}
OrderStatusController.php
class OrderStatusController extends Controller
{
public function pending($id) { /* 待处理 */ }
public function confirmed($id) { /* 已确认 */ }
public function processing($id) { /* 处理中 */ }
public function completed($id) { /* 已完成 */ }
public function cancelled($id) { /* 已取消 */ }
}
OrderPaymentController.php
class OrderPaymentController extends Controller
{
public function pay($orderId) { /* 支付 */ }
public function refund($orderId) { /* 退款 */ }
public function callback($orderId) { /* 支付回调 */ }
}
路由规划建议
// routes/web.php
Route::prefix('orders')->group(function () {
// 基础CRUD
Route::get('/', [OrderController::class, 'index']);
Route::post('/', [OrderController::class, 'store']);
// 状态管理
Route::prefix('status')->group(function () {
Route::post('/{id}/confirm', [OrderStatusController::class, 'confirm']);
Route::post('/{id}/cancel', [OrderStatusController::class, 'cancel']);
});
// 支付相关
Route::prefix('payment')->group(function () {
Route::post('/{id}/pay', [OrderPaymentController::class, 'pay']);
Route::post('/{id}/refund', [OrderPaymentController::class, 'refund']);
});
});
分层原则
判断标准:
- 职责单一 - 一个控制器只负责一种业务场景
- 方法数量合理 - 单个控制器方法不超过10-15个
- 语义清晰 - 控制器名称能反映其职责
- 复用性 - 类似业务逻辑集中管理
使用服务层辅助:
// 控制器保持轻量
class OrderController extends Controller
{
private OrderService $orderService;
public function store(Request $request)
{
// 只负责参数验证和响应
$result = $this->orderService->createOrder($request->validated());
return response()->json($result);
}
}
注意事项
- 不要过度拆分 - 一个模块最好保持在3-5个控制器以内
- 保持一致性 - 团队统一拆分标准
- 考虑扩展性 - 为新功能预留空间
- 文档更新 - 更新路由和控制器映射关系
通过合理分层,可以使项目结构更清晰、团队协作更高效,同时也便于后续维护和扩展。