扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
thinkphp6开启多应用模式(在thinkphp5对应的是多模块),假设我们设置home应用为前台模块,admin为后台模块,api为api接口模块,common为公共数据处理模块。那么网站前台的访问路径可能是这样的:
https://www.csweigou.com/home/project/view/id/21.html
可以通过路由规则重写,如这样的代码
Route::get('/item/:id', 'home/project/view');
这样上面开头的链接会变成:
https://www.csweigou.com/item/21.html
实际上作为用户前台都带上一个并没有多少意义的home/,自然会影响url的美观度。虽然可以通过重写路由规则来一个个方法来重写,但是这个下面这个路径:
https://www.csweigou.com/home/index/index.html
即便通过路由规则重写,如这样的代码:
Route::get('/', 'home/index/index');
生成的地址是这样的:
https://www.csweigou.com/home/
而且路由规则重新我们需要针对一个个方法分别重新,那么有没有什么办法不管是什么路径都可以统一完成重写呢?也就是在默认路由生成的url中去掉应用的名称(如home)呢?
答案当然是有的!当然,thinkphp6的设计理念就已经不再是面向后台和前端融合在一起的传统开发方式,而是针对前后端分离开发而设计的,比如最典型的就是已经把session给禁用了,而是用一种类似cache的方式来模拟实现session。但是,实际上thinkphp6用来做非前后端分离的应用也是可以的。首先说明的是,这篇文章虽然是针对最新的tinkphp6,但对于thinkphp5也具有参考意义。
方法一:应用绑定域名
通过config/app.php来配置多域名,设置domain_bind,如这样设置:
// 域名绑定(自动多应用模式有效) 'domain_bind'=> [ 'www'=>'home', 'sys'=>'admin', 'api'=>'api' ],
这样访问www这个子域名就可以访问home应用,而且url中会自动去掉home。这种方式也是框架设计就预留的一种方式,配置过程是相对简单的,但前提是这个站点必须同时绑定多个域名(如果有多个可通过url访问的应用)。那么如果只能绑定一个域名,而且同时要满足多应用呢是否可以呢?答案是可以的,但前提是admin和api应用的url中不需要删除对应的应用名称,否则某些路径可能跟home应用混淆了,下面两种方法就是实现的两种方式。
方法二:前台应用直接使用app根目录的应用
也就是控制器目录直接是app\controller,而其他的应用则分别是app\应用名(如admin)\controller,这种虽然看上去有点不伦不类,但这样确实就不存在对应的应用名称的。但是,如果需要在其他应用中生成前台应用的url就会出现异常,比如在后台文章列表中需要生成一个文章前台访问的网址。这时候假设url写法是这样的:
url('posts/view',['id'=>1])
我们预期要生成的url是
posts/view/id/1.html
但实际上thinkphp会自动认为这个url是后台这个应用的路由,于是就变成了
admin/posts/view/id/1.html
那怎么办呢?还是有办法的,那就是在后台生成前台应用的url的时候,不使用thinkphp自带的url助手方法,自己重写一个方法,如home_url。
function home_url($path,$vars=[]){ $string=url(strtolower($path),$vars,true,false)->build(); $defalutModule = 'home'; $search = '/'.$defalutModule.'/'; $pos = stripos($string, $search); if($pos !== false && substr_count(rtrim($string,'/'), '/') >= 2) { $string = substr($string, 0, $pos).'/'.substr($string, $pos + strlen($search)); } return $string; }
然后在后台生成前台url的时候,使用home_url代替url,且在路径上加上home。
url('home/posts/view',['id'=>1])
这样就可以生成我们所预期的url。
方法三:在入口文件指定应用
依然创建home应用作为网站前台,前台的url生成不使用url,而采用类似方法二中的home_url来重新url生成规则。但只是生成不带home的url,这样方法肯定会报错,因为这样默认肯定会方法app\controller下的控制器了。那么如何使用不含home的url直接访问到app\home\controller呢。那就是在入口文件(默认位于public\index.php),修改如下代码:
$response = $http->run();
修改为:
$response = $http->name('home')->run();
但是这样一来home应用是可以正常访问,但admin、api等其他应用访问肯定是异常的,这时候需要给admin、api等其他应用创建自己的入口文件,比如admin,可以复制index.php代码(把其中的home改为admin)另存为admin.php,其他应用一样的道理。但这样admin、api的路径都需要修改,如果是新项目还好,如果是已经写好的项目那么就有点麻烦了。其实,如果不需要删除admin、api等应用的url中的应用名称,其实可以在入口文件中这么写:
$path=isset($_SERVER['QUERY_STRING'])?$_SERVER['QUERY_STRING']:''; if(stripos($path,'admin')==1 || stripos($path,'api')==1){ $response = $http->run(); }else{ $response = $http->name('home')->run(); }
这段代码的意思是,如果访问的路径是admin或api开头的,则需要url指定应用名称;而home应用则无需指定应用名,英文在入口文件中就已经指定了。
方法四:最粗暴的方法,在web服务器软件重写url
首先借鉴方法二中的home_url方法,把home应用的url生成为不带home的url,直接访问肯定是不行的。可以通过web服务器软件(如apache或nginx)进行规则重写,也就是我们通常所说的服务器伪静态规则,实现访问不带home的url自动指向到app\home\controller下的方法。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流