使用Thinkphp6路由调度,实现文件夹控制器

浏览:864 发布日期:2021/07/07 分类:ThinkPHP6专区 关键字: thinkphp6 路由调度
官方支持的需要在url内用“.”来代替“/”这样显示的效果不是很美观,可能我有强迫症,后台还要折腾这个[哭笑],不过把代码分享出来以便其他同学可以用到。思路参考自:https://github.com/top-think/framework/pull/2188

示例
默认用文件夹方式需要访问的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];
    }
}
最佳答案
评论( 相关
后面还有条评论,点击查看>>