2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
你好!
瓦西娅 曾有一个控制器分发器,其代码行数已超过 1000 行。每增加一个新功能,就意味着在同一文件中添加更多的条件判断。本文将介绍如何用领域专用路由器取代该分发器,每个路由器都实现一个包含两个方法的接口,从而使路由逻辑保持作用域清晰且易于测试。
分发器的作用
graph TD
A[HTTP 请求] --> B[路由器]
B -->|将 URL 匹配到路由| C[分发器]
C -->|选择控制器,注入上下文| D[控制器]
D --> E[响应]
路由器负责将 URL 与路由定义进行匹配。分发器则根据该匹配结果,确定要实例化哪个控制器、调用哪个方法,以及如何传入请求上下文。在大多数框架中,你无需考虑这些细节,因为框架会自动为你处理。
问题始于分发器变成“决定运行哪段代码”的地方,并逐渐演变为一长串条件判断。
为何单一的分发器会失效
一个处理所有请求类型的单一的分发器会迅速积累大量条件判断。最终你会得到类似下面这样的代码:
public function dispatch(Request $request): Response
{
$controller = $request->attributes->get('_controller');
if ($controller === 'entity_types') {
// 40 行实体类型列表逻辑
} elseif (str_starts_with($controller, 'entity_type.')) {
// 60 行生命周期管理逻辑
} elseif ($controller === 'openapi') {
// 80 行 OpenAPI 规范生成逻辑
} elseif (str_contains($controller, 'SchemaController')) {
// 50 行模式处理逻辑
}
// ... 以此类推,涵盖每个领域
}
实体的增删改查(CRUD)、模式生成、生命周期管理、OpenAPI 文档:所有这些功能都通过同一个类进行处理。每新增一个功能,就要添加一个新的分支,而测试其中任意一条路径,都需要加载所有路径的上下文。
解决方案并非改进分发器本身,而是使用更小、更专注的路由器,每个路由器只负责一个领域。
领域路由器接口契约
领域路由器是一个小型类,负责
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。