2
Router

yutent edited this page 2023-11-02 17:25:52 +08:00

路由

框架内置一个简洁高效的 路由中间件,框架的理念是, 让开发者不再需要过多关注路由, 所以请求的路径直接对应着控制器文件名。开发者无需编写任何路由规则。

路由模式一

这是默认的模式。

先假设几个访问地址, 如下:

http://abc.com
http://abc.com/foo/bar
http://abc.com/aaa/bbb/ccc/ddd
  • 先看第1个, 没有任何路径。

这种情况, 路由会默认为 /index, 即, 此时路由会在apps目录中寻找一个叫index.js的文件, 如果能找到, 就实例化它, 如果找不到就抛出404,并提示Controller [index] not found

这里继续讲解 index.js存在的情况, 实例化之后呢? 这时候, 就要看url路径中的第2段值, 这里因为没有路径, 所以会默认为 /index/index, 即 http://abc.com 等价于 http://abc.com/index/index

于是, index.js被实例化之后, 又会被自动调用indexAction() 方法, 这里的方法名为什么会多出一个Action呢? 这是为了避免路径的值可能会命中js保留关键字, 所以特意设计的, 这也是YAF框架的做法, 很简单, 却很实用。

  • 接下来看第2个url, 这里不再是光杆域名了。

从上面第1个例子, 其实就已经可以看出来了, 这里, 将会去apps目录下寻找 foo.js文件, 并且 实例化之后, 调用barAction() 这个方法。

  • 这里再看最后一个例子。

我们发现, 这里如果按上面的规则来拆分的话, 这个路径是有4段的。我们已经知道, 第1段是用来寻找对应的应用文件名的。 第2段是决定调用哪个方法的。

那后面的第3段, 第4段, 甚至更多呢? 剩下的将作为参数, 依次传入被调用的方法中。

拿这个例子来说, 最终就是 寻找到aaa.js文件, 实例化调用,bbbAction('ccc', 'ddd')

路由模式二

通常情况下, 使用模式一, 完全能满足99.9999%的需求。但是偶尔业务需要动态路由, 但是又不想用户请求的路径过长。那便可开启模式二

import { createApp } from '@gm5/core'

const app = createApp({ dynamic: true })

// or
app.set({ dynamic: true })

开启动态路由模式, 无论是访问路径是什么, 永远只会调用 \apps\index\indexAction(), 剩余的路径, 会以参数形式, 传入indexAction()