ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 路由 ## 简介 接触过Laravel、Slim Framework、ThinkPHP等框架的朋友应该知道,路由(Routing)是一种解析URL并指向Action(动作)的组件。在Laravel、ThinkPHP中,路由通常绑定Controller。在TarBlog中,路由绑定Action。通常而言,一个路由对应一个Action,但也有可能多个路由对于一个Action。不可能出现一个路由对应多个Action的情况,哪怕URL Pattern(URL表达式)相同。在URL相同的情况下,路由器根据Action的execute返回值(bool)来判断是否继续处理下一个路由。若所有匹配的URL所对应的Action的execute返回值都为false,则视为路由无效,Http Code设为404且显示Not Found页面。 ## 实现原理 调用dispatch后,路由器开始遍历路由并执行uriMatch,若符合则执行对应的Action,返回true代表该路由有效,则无需继续遍历;若返回false,说明该路由无效,路由器继续遍历。遍历到结束仍然无返回值为true的情况下,则显示404页面。 整个路由器的精华就是uriMatch,它使用正则表达式来验证当前URL是否和路由的URL表达式相匹配,并且考虑了各种各样的情况,其中包括directory这种多层目录(但是执行效率较低,不建议使用)。详细的代码可以查看var/Core/Routing/Router.php。除此之外,也考虑了URL相同的情况,比如文章和页面使用同一套或者相似的URL结构,此时可以通过Action里面进行数据库里数据类型判断来过滤该URL是否属于该Action,不属于则返回false,路由器再找另一个Action。这样可以非常有效地防止多个URL对应同一篇文章或者同一个页面,导致SEO混乱。 ## 路由器说明 由于内容较多,只说明常用部分,其他部分请查阅源代码。 ### dispatch 执行路由匹配的入口,它先获取一些系统内容(主题名称和目录),然后遍历路由列表,URL匹配则执行对应Action,execute为true则再执行render(前端渲染),为false则继续遍历。若没有Action成功执行,则显示404页面。 ### refreshRoutesNameList 这个东西是为了刷新路由名称列表,每个路由可以设置自己的名称,这样可以通过getRouteByName来获取对于的路由。不刷新的话getRouteByName是没有用的。 ### getRouteByName 通过路由名称获取对应路由,非常实用的功能。 ## 路由对象 类似于Laravel,TarBlog使用路由对象储存路由信息。储存了路由名称、路由Uri、路由动作(Action)、支持多层路径的参数列表($multiDivParams)、路由参数指定表达式列表。这个东西应该还好理解,那么就不细讲了。