路由
内置路由
内置路由位于 src/Http/Router.php
前缀
URL若以此开头,则此部分不会参与解析。如:
use Yesf\Http\Router;
function run(Router $router) {
$router->setPrefix('/user');
}
1
2
3
4
5
2
3
4
5
访问http://example.com/user/index/user/view
时,实际参与解析的是/index/user/view
。
默认为空。
Restful风格
支持get、post、put、delete、head、options、connect。如:
$router->get('/user/{id}', [
'module' => 'index',
'controller' => 'user',
'action' => 'view'
], [
'id' => '(\d+)'
]);
1
2
3
4
5
6
7
2
3
4
5
6
7
这段代码做了:
- URL格式为
user/{id}
- 将其解析为index模块、user控制器、view功能
- id需要满足正则表达式
/^(\d+)$/
您也可以使用闭包:
$router->get('/user/{id}/{action}', function($param) {
return [
'module' => 'index',
'controller' => 'user',
'action' => $param['action']
];
}, [
'id' => '(\d+)'
]);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
您也可以使用any,它的优先级是最低的:
$router->any('/user/{id}', [
'module' => 'index',
'controller' => 'user',
'action' => 'view'
], [
'id' => '(\d+)'
]);
1
2
3
4
5
6
7
2
3
4
5
6
7
您可以简写第二个参数:
$router->any('/user/{id}', 'index.user.view');
1
Map
默认的隐式路由,不需要特别配置。将会按module/controller/action
的规则解析。
如index/user/view?id=1
会解析至Index模块、User控制器、View功能。
您可以手动关闭它:
在项目配置中:
'router' => [
'map' => false
]
1
2
3
2
3
或在代码中:
$router->disableMap();
1
自定义路由
可以自定义路由,不使用内置路由。
首先,编写类实现RouterInterface,如:
use Yesf\Http\RouterInterface;
class MyRouter implements RouterInterface {
public function parse(Request $request) {
if (strpos($request->server['request_uri'], '/user') === 0) {
$request->module = 'user';
$request->controller = 'index';
$request->action = 'index';
} else {
$request->module = 'index';
$request->controller = 'index';
$request->action = 'index';
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在Dispatcher上注册:
namespace YesfApp;
use MyRouter;
use Yesf\Http\Dispatcher;
class Configuration {
public function setRouter(Dispatcher $dispatcher, MyRouter $router) {
$dispatcher->setRouter($router);
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
← 静态文件 Request:请求 →