Swoft中路由是通过注解@Controller + @RequestMapping
组合来实现的,主要包括:
-
@Controller
在控制器类中使用,用于定义路由前缀。 -
@RequestMapping
在控制器类的动作方法中使用,用于定义路由后缀。
创建路由Route
根据约定大于配置的规则,路由应该在用户看到URI
的时候,就能找到与之对应的Controller/Action
。
例如:要访问的路由为/admin/account/index
,路由前缀@Controller
可以直接定义到控制器这一层/admin/account
。路由后缀@RequestMapping
可以直接定义到动作方法这一层index
,注意不用在前面添加/
,可以是方法名称也可以是其它名称。
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;
/**
* 账号管理
* @Controller(prefix="/admin/account")
*/
class AccountController
{
/**
* @RequestMapping(route="index", method={RequestMethod::GET})
* @View(template="admin/account/index", layout="admin/layout")
* @return array
*/
public function index(Request $request):array
{
}
}
首先,使用路由前,必须引入与之对应的注解类。
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;
注意:视图注解@View
中的模板与布局参数中的值与路由比较起来会发现,它的路径是不需要前面添加/
的。
@View(template="admin/account/index", layout="admin/layout")
若添加了/
如/admin/account/index
则会出现错误
{
"msg":"cannot render '\/admin\/account\/index' because the view file does not exist. File: \/admin\/group\/index.php",
"file":"\/var\/www\/swoft\/vendor\/swoft\/view\/src\/Base\/View.php",
"line":136,
"code":0
}
建议这些细节的地方,追踪源码进行修改下,有时间自己会做做。
类注解@Controller
@Controller
表示类注解,使用在控制器类上,标记当前类是一个HTTP控制器类。
显式指定路由前缀
@Controller(prefix="/route")
@Controller("/route")
隐式指定路由前缀
@Controller()
默认自动解析为controller class
控制器类名,注意使用驼峰法命名格式。
方法注解@RequestMapping
@RequestMapping
表示方法注解,用于控制器类的动作方法Action
上。
格式:@RequestMapping(route, method)
/**
* @RequsetMapping(route, method)
*/
public function actionName(){}
参数:
-
route
表示设置的路由路径path
,是默认参数。 -
method
表示允许的请求方法,可设置多个。
使用:
- 显式指定路由后缀
@RequestMapping()
@RequestMapping("index")
@RequestMapping(route="index")
- 隐式指定路由后缀
如果不使用@RequestMapping
或@RequestMapping()
则默认解析方法名为后缀。
指定路由方法用于限定HTTP请求的方式
@RequestMapping(route="index", method=RequestMethod::GET)
@RequestMapping(route="index", method={RequestMethod::GET,RequestMethod::POST})
指定路由参数,在Action动作方法中可直接使用$name
作为方法参数。
@RequestMapping(route="index/{$name}", method=RequestMethod::GET)
例如:要访问路由的URI为/admin/account/state/1
/**
* @RequestMapping(route="state/{pk}", method={RequestMethod::GET})
*/
public function state(Request $request, $pk)
{
var_dump($pk);//string(1) "1"
return response()->redirect("/admin/account/index");
}
注意:这里使用的变量名为pk
,可自由定义,获取出来的是一个字符串类型的值。
说明:
- 使用注解必须要提前引入对应注解类
- 完整的路由
path
由控制器Controller
的前缀prefix
后跟动作方法Action
的路由route
共同组成 - 当动作方法
Action
上的路由以/
开头时,完整的路由就是它。
路由配置httpRouter
Swoft中HTTP路由的配置文件在/swoft/config/beans/base.php
。
'httpRouter' => [
'ignoreLastSlash' => false,
'tmpCacheNumber' => 1000,
'matchAll' => '',
],
配置参数解析
-
ignoreLastSlash
表示是否忽略最后一个斜杠,若设置为false
则/user/index
和/user/index/
表示两个不同的路由。 -
tmpCacheNumber
表示缓存路由的数量,默认最近1000条。缓存到路由对象的重启后会失效,只会缓存动态路由。 -
matchAll
表示匹配所有,也就是所有请求都会匹配到这个URL或闭包中。