跟着手册学TP5 —— 路由(二)

Crasph彬 182 0


路由参数

在路由的定义中的$option数组可定义相应的路由参数,例如对后缀的过滤,对https的过滤等等,常见的路由参数如下 :

参数说明
method请求类型检测,支持多个请求类型
extURL后缀检测,支持匹配多个后缀
deny_extURL禁止后缀检测,支持匹配多个后缀
https检测是否https请求
domain域名检测
before_behavior前置行为(检测)
after_behavior后置行为(执行)
callback自定义检测方法
merge_extra_vars合并额外参数
bind_model绑定模型(V5.0.1+
cache请求缓存(V5.0.1+
param_depr路由参数分隔符(V5.0.2+
ajaxAjax检测(V5.0.2+
pjaxPjax检测(V5.0.2+

请求类型

除了定义路由时明确指出请求类型的外,any或者rule可以在options中定义method参数来过滤请求类型,例:

//下路由仅仅get下有效
Route::any('index/:id','index/index/index',['method'=>'get']);
//下路由在post或者get下有效
Route::any('index/:id','index/index/index',['method'=>'get|post']);

后缀

定义路由是可以指定允许的后缀或者禁止访问的地址,如下:

//允许html,shtml后缀的访问,例如:http://tp.hbb/index/4.html
Route::get('index/:id','index/index/index',['ext'=>'html,shtml']);
//禁止jpg,jpeg,xml等后缀访问
Route::get('index/:id','index/index/index',['deny_ext'=>'jpg|jpeg|xml']);

domain和https

可以设置允许访问的域名或者子域名,也可设置https访问权限等,例如:

//只允许https访问该路由
Route::any('index/:id','index/index/index',['https'=>true]);
//完整域名检测,只允许test.tp.hbb域名访问
Route::any('index/:id','index/index/index',['domain'=>'test.tp.hbb']);
//只允许子域名test域名访问
Route::any('index/:id','index/index/index',['domain'=>'test']);

等等…………

路由地址

路由地址支持以下5种方式:

定义方式定义格式
方式1:路由到模块/控制器'[模块/控制器/操作]?额外参数1=值1&额外参数2=值2...'
方式2:路由到重定向地址'外部地址'(默认301重定向) 或者 ['外部地址','重定向代码']
方式3:路由到控制器的方法'@[模块/控制器/]操作'
方式4:路由到类的方法'\完整的命名空间类::静态方法'  或者 '\完整的命名空间类@动态方法'
方式5:路由到闭包函数闭包函数定义(支持参数传入)

方式1路由到模块/控制器:

    这是最常用的一种路由方式,把满足条件的路由规则路由到相关的模块、控制器和操作,然后由App类调度执行相关的操作。

同时会进行模块的初始化操作(包括配置读取、公共文件载入、行为定义载入、语言包载入等等)。

路由地址的格式为:

[模块/控制器/操作]?额外参数1=值1&额外参数2=值2..

例如:

Route::get('index/:id','index/index/index?name=5&tp=3');
当然额外的参数可以省略

改路由方式也支持多级控制器,例如:命名空间为app\index\controller\group的路由可以定义为如下形式:

Route::get('index/:id','index/group.index/index');

当然,该种形式也支持动态绑定,依然以上述为例:

//此路由可有 group/test/5访问,此时的group模块为动态的
Route::get(':group/test/:id','index/:group.index/index');

方式2路由到控制器的方法:

这种方式看起来似乎和第一种是一样的,本质的区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作这些,同时也不会去初始化模块。
例如,定义如下路由后:

'blog/:id'=>'@index/blog/read',

系统会直接执行

Loader::action('index/blog/read');

相当于直接调用 \app\index\controller\blog类的read方法。

方式3路由到类的方法:

此方式相当于直接调用该方法,路由的格式为:

'\完整的命名空间类::静态方法'
'\完整的命名空间类@动态方法'

例:

//此方法相当于直接调Index下的index方法
Route::get('index/:id','\app\index\controller\Index@index');
//此方式相当于直接调用Index下的hello静态方法
Route::get('hello/:id','\app\index\controller\Index::hello');

方式4路由到重定向地址:

重定向的外部地址必须以“/”或者http开头的地址。

如果路由地址以“/”或者“http”开头则会认为是一个重定向地址或者外部地址,例如:

Route::get('test/:id','http://www.baidu.com');
Route::get('test/:id','/index/index/hello/id/:id');

写一个使用例子吧,之前我在tp官网上写了篇tp5数组分页的文章,由于后期博客迁移,导致留的链接http://crasphter.cn/index.php/archives/66

早已经不能使用,新的链接为http://crasphter.cn/article/15 这种情形下,我们就可以使用此重定向的方法,把旧的网址重定向到新的上面,例:

Route::get('archives/66','/article/15');

此种方式就可以方便的重新定向



支付宝打赏
微信打赏
发表评论
表情 图片 链接 代码

分享
微信
微博
QQ