@@ -5,120 +5,9 @@ lang: zh-CN
55
66# 路由
77
8- ## 默认内置路由
8+ ## 内置路由
99
10- > 默认内置路由位于 src/Http/Router.php
11-
12- 默认内置路由支持Rewrite、Regex、Map三种方式解析URL。优先级为 Regex > Rewrite > Map。
13-
14- ### 前缀
15-
16- URL若以此开头,则此部分不会参与解析。如:
17-
18- ``` php
19- use Yesf\Http\Router;
20-
21- function run(Router $router) {
22- $router->setPrefix('/user');
23- }
24- ```
25-
26- 访问` http://example.com/user/index/user/view ` 时,实际参与解析的是` index/user/view ` 。
27-
28- 默认为` / ` 。
29-
30- ### Regex
31-
32- 以正则方式解析。
33-
34- ``` php
35- use Yesf\Http\Router;
36-
37- function run(Router $router) {
38- $router->addRegex('/^thread-view-([0-9]+)-([0-9]+)\\.html$/', [
39- 'module' => 'index',
40- 'controller' => 'forum',
41- 'action' => 'view'
42- ], [
43- // 完成数字到字符变量的映射
44- 1 => 'id',
45- 2 => 'page'
46- ]);
47- }
48-
49- // 当访问 thread-view-123-2.html 时
50- class Forum extends ControllerAbstract implements ControllerInterface {
51- public function ViewAction(Request $request, Response $response) {
52- echo $request->param['id']; // 123
53- echo $request->param['page']; // 2
54- }
55- }
56- ```
57-
58- ### Rewrite
59-
60- 以简单的重写方式解析。
61-
62- 匹配的路径使用一个特别的标识来告诉路由协议如何匹配到路径中的每一个段,这个标识有有两种,可以帮助我们创建我们的路由协议:
63-
64- * 冒号(:):包含一个变量用于传递到我们动作控制器中的变量,例如我们使用` :name ` ,,我们可以在动作中使用` $request->param['name'] ` 获取到它的值。
65-
66- * 星号(\* ):一个通配符, 意思是在它后面的所有段都将作为一个通配数据被存储,例如我们使用'path/: name /* ',我们访问的` /path/foo/test/value1/another/value2 ` ,那么我们会得到下面的结果:
67-
68- ``` php
69- echo $request->param['test']; // value1
70- echo $request->param['another']; // value2
71- ```
72-
73- Demo:
74-
75- ``` php
76- use Yesf\Http\Router;
77-
78- function run(Router $router) {
79- $router->addRewrite('user/:id/feed/*', [
80- 'module' => 'index',
81- 'controller' => 'user',
82- 'action' => 'feed'
83- ]);
84- }
85-
86- // 当访问 user/123/feed/page/1/filter/video 时
87- class User extends ControllerAbstract implements ControllerInterface {
88- public function FeedAction(Request $request, Response $response) {
89- echo $request->param['id']; // 123
90- echo $request->param['page']; // 1
91- echo $request->param['filter']; // video
92- }
93- }
94- ```
95-
96- ### Map
97-
98- 默认的解析方式,不需要特别配置。将会按` module/controller/action ` 的规则解析。
99-
100- 如` index/user/view?id=1 ` 会解析至Index模块、User控制器、View功能。
101-
102- ## Restful风格内置路由
103-
104- > Restful风格内置路由位于 src/Http/RestfulRouter.php
105-
106- ### 启用
107-
108- 在Dispatcher上注册:
109-
110- ``` php
111- namespace YesfApp;
112-
113- use Yesf\Http\RestfulRouter;
114- use Yesf\Http\Dispatcher;
115-
116- class Configuration {
117- public function setRouter(Dispatcher $dispatcher, RestfulRouter $router) {
118- $dispatcher->setRouter($router);
119- }
120- }
121- ```
10+ > 内置路由位于 src/Http/Router.php
12211
12312### 前缀
12413
@@ -136,7 +25,7 @@ function run(Router $router) {
13625
13726默认为` / ` 。
13827
139- ### 方法
28+ ### Restful风格
14029
14130支持get、post、put、delete、head、options、connect。如:
14231
@@ -170,6 +59,46 @@ $router->get('user/{id}/{action}', function($param) {
17059]);
17160```
17261
62+ 您也可以使用any,它的优先级是最低的:
63+
64+ ``` php
65+ $router->any('user/{id}', [
66+ 'module' => 'index',
67+ 'controller' => 'user',
68+ 'action' => 'view'
69+ ], [
70+ 'id' => '(\d+)'
71+ ]);
72+ ```
73+
74+ 您可以简写第二个参数:
75+
76+ ``` php
77+ $router->any('user/{id}', 'index.user.view');
78+ ```
79+
80+ ### Map
81+
82+ 默认的隐式路由,不需要特别配置。将会按` module/controller/action ` 的规则解析。
83+
84+ 如` index/user/view?id=1 ` 会解析至Index模块、User控制器、View功能。
85+
86+ 您可以手动关闭它:
87+
88+ 在项目配置中:
89+
90+ ``` php
91+ 'router' => [
92+ 'map' => false
93+ ]
94+ ```
95+
96+ 或在代码中:
97+
98+ ``` php
99+ $router->disableMap();
100+ ```
101+
173102## 自定义路由
174103
175104可以自定义路由,不使用内置路由。
0 commit comments