ThinkPHP5只让路由对index作用,不对admin作用。多模块多入口方式隐藏后台地址及路由冲突解决方案
Posted qikexun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP5只让路由对index作用,不对admin作用。多模块多入口方式隐藏后台地址及路由冲突解决方案相关的知识,希望对你有一定的参考价值。
用伪静态,把文章的路径设置成qiyet.cn/category1/category2/id.html 这样的格式。其中,涉及到两个参数,分类和id.于是,
遇到一个全动态路由设置的问题,问了很多人都没人解决,还是知乎上人才众多,竟然给解决了,就是绑定模块,加一个判断,我的路由配置局部代码如下:
switch(strtolower(BIND_MODULE))
case 'index':
// index模块路由定义
Route::rule(':cate/:id','index/goods/index');
Route::get('<name>/<id>','index/goods/index',[],['name'=>'[a-zA-Z]+','id'=>'\\d+']);//推荐使用这个格式,以上的格式容易冲突
break;
case 'admin':
// admin模块路由定义
break;
default:
代码真是简洁又优雅,为了向作者致敬,写入原文来源地址:https://zhuanlan.zhihu.com/p/134238563
如果你的路由规则比较特殊,可以在路由定义的时候使用组合变量。
例如:
Route::get('item-<name>-<id>','product/detail',[],['name'=>'\\w+','id'=>'\\d+']);
组合变量的优势是路由规则中没有固定的分隔符,可以随意组合需要的变量规则,例如路由规则改成如下一样可以支持:
Route::get('item<name><id>','product/detail',[],['name'=>'[a-zA-Z]+','id'=>'\\d+']);
Route::get('item@<name>-<id>','product/detail',[],['name'=>'\\w+','id'=>'\\d+']);
如果需要使用可选变量,则可以使用:
Route::get('item-<name><id?>','product/detail',[],['name'=>'[a-zA-Z]+','id'=>'\\d+']);
关于define(BIND_MODULE)的定义问题
define(BIND_MODULE)这个定义在哪个文件里面?
另外,为了以后方便查找和供后来人参考,摘抄备份如下:
我们在应用Thinkphp5进行系统开发时,为了巩固后台安全,常常利用多入口机制来隐藏后台地址,在此以index和admin两个模块举例说明具体实现步骤及问题解决方案:
1:建立后台入口文件 如 admin.php,内容为:
<?php
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');
// 绑定当前入口文件到admin模块
define('BIND_MODULE','admin');
// 加载框架基础文件
require __DIR__ . '/thinkphp/start.php';
2:在配置文件config.php设置:
<?php
// 禁止访问模块
'deny_module_list' => ['common','admin'],
来禁止admin模块访问。
3:但在实际开发时,发现多模块多入口情况下,全局路由可能会同时影响index和admin模块,比如路由定义:
<?php
Route::rule('product/:id', 'index/Product/read');
Route::rule('product', 'index/Product/index');
实测中发现如果admin模块中也有product控制器及product控制器中有index方式,会报错:模块不存在:如下图
鉴于此,试图网上搜索TP5的路由按模块配置的解决方案,有改源码的,有利用路由分组,有截取URL按条件设置路由的等等,结果尝试了都不太好用,在此给出的解决方案是:
在index入口文件中显式绑定index模块:
<?php
// 绑定当前入口文件到index模块
define('BIND_MODULE','index');
这样,前台绑定index,后台绑定admin,我们就可以利用常量BIND_MODULE进行路由按模块定义:
<?php
switch(strtolower(BIND_MODULE))
case 'index':
// index模块路由定义
Route::rule('product/:id', 'index/Product/read');
Route::rule('product', 'index/Product/index');
break;
case 'admin':
// admin模块路由定义
break;
default:
经测试,解决后台地址隐藏及路由分模块定义同时没有发现系统异常。
以上是关于ThinkPHP5只让路由对index作用,不对admin作用。多模块多入口方式隐藏后台地址及路由冲突解决方案的主要内容,如果未能解决你的问题,请参考以下文章