官方支持的需要在url内用“.”来代替“/”这样显示的效果不是很美观,可能我有强迫症,后台还要折腾这个[哭笑],不过把代码分享出来以便其他同学可以用到。
思路参考自:https://github.com/top-think/fr示例
默认用文件夹方式需要访问的url
/site.pay.log/search
修改后的访问url/site/pay/log/search
路由配置<?php
use think\facade\Route;
// 更多层,每个名称,不能被包含,例如 “:module/::modules/::moduless” 这样会出错
Route::get(':module/:folder/:isszz/:cfyun/:controller/:action', \app\admin\libs\RouteDispatch::class);
Route::get(':module/:folder/:isszz/:controller/:action', \app\admin\libs\RouteDispatch::class);
// 二层
Route::get(':module/:folder/:controller/:action', \app\admin\libs\RouteDispatch::class);
Route::get(':module/:folder/:controller', \app\admin\libs\RouteDispatch::class);
Route::get(':module/:controller', \app\admin\libs\RouteDispatch::class);
路由调度类<?php
declare (strict_types = 1);
namespace app\admin\libs;
use think\App;
use think\helper\Str;
use think\route\dispatch\Controller as ControllerDispatch;
class RouteDispatch extends ControllerDispatch
{
protected $defaultController = 'Index';
protected $defaultAction = 'index';
public function init(App $app)
{
$this->app = $app;
$this->doRouteAfter();
[$controller, $action] = $this->getControllerAndActionFromParam();
$this->controller = Str::studly($controller);
$this->actionName = Str::studly($action);
$this->request
->setController($this->controller)
->setAction($this->actionName);
}
/**
* 从请求获取控制器和动作
*/
protected function getControllerAndActionFromParam(): array
{
$params = $this->request->route();
$controller = $this->defaultController;
$action = $this->defaultAction;
if(empty($params)) {
return [$controller, $action];
}
$_controller = '';
$count = count($params);
$_params = array_values($params);
if(!empty($_params['0']) && strpos($_params['0'], '.')) {
return [$_params['0'], $_params['1'] ?? $action];
}
$action = array_pop($_params);
$controller = array_pop($_params);
$path = implode(DIRECTORY_SEPARATOR , $_params);
if ($count < 4) {
if(empty($path)) {
if(is_file(app_path('controller' . DIRECTORY_SEPARATOR . $controller) . Str::studly($action) .'.php')) {
$_controller = $controller . '.' . $action;
return [$_controller, $this->defaultAction];
}
if(is_file(app_path('controller') . Str::studly($controller) .'.php')) {
$_controller = $controller;
return [$_controller, $action];
}
}
}
if(is_file(app_path('controller' . DIRECTORY_SEPARATOR . $path . DIRECTORY_SEPARATOR . $controller) . Str::studly($action) .'.php')) {
$_controller = implode('.', $_params) . '.'. $controller . '.' . $action;
return [$_controller, $this->defaultAction];
}
if(is_file(app_path('controller' . DIRECTORY_SEPARATOR . $path) . Str::studly($controller) .'.php')) {
$_controller = implode('.', $_params) . '.'. $controller;
return [$_controller, $action];
}
return [$controller, $action];
}
}
最佳答案
