laravel项目改造为微擎项目,路由跳转时出现问题

公司laravel项目改造为微擎项目。
laravel项目RouteServiceProvider 中增加了route.php,作为默认路由文件,在这里进行路由转发。
通过微擎框架进入到本项目的路由,都会通过route.php重新分配路由,以访问laravel项目的真实路由,但是在路由转发时出现2种情况,1、页面404,2、微擎框架报错
页面404 肯定是路由没找到。
微擎框架报错,我理解为路由分发错误,导致系统又访问微擎框架,才会出现的问题, 下面是我的代码

 Route::group([ 'namespace' => 'Admin'], function () use (pilot, method) {
       Route::addRoute(Route::createRoute('get', 'LoginController', 'login'));
//     Route::post($pilot.'/'.$method, 'LoginController@login')->name('admin-login');
//     Route::redirect($pilot.'/'.$method, 'login', 302);
//     Route::get($pilot.'/'.$method, 'LoginController@login');
});

但是目前没查到怎么解决这个问题。也可能是我理解错误,还希望能指正。
laravel版本 为laravel6.0

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

前段时间一直在忙,所以没有贴答案,现在贴一下
参考链接:gitee.com/liushuai05/we7_test
下面是我site.php的代码

 public function returnUri(){
    global  $_GPC;
    $tpM = $_GPC['do'] ? $_GPC['do']:'index';
    $tpC = isset($_GPC['tp_c'])? $_GPC['tp_c']:'index';
    $tpC = strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $tpC), "_"));
    $tpA = isset($_GPC['tp_a'])? trim($_GPC['tp_a']):'index';
    return ['url'=>"/".$tpM."/".$tpC."/".$tpA, 'module'=>$tpM];
}

public function returnSet($Route){

        ob_clean(); //调试模式下 清除外部框架 的错误输出 要不会报错
        /**
         * @var $request Psr\Http\Message\ServerRequestInterface
         */
        $manager = new \Illuminate\Database\Capsule\Manager();
        $manager->setAsGlobal();
        $manager->bootEloquent(); //ORM
        // 微擎屏蔽了 数据库连接信息 直接强改pdo
        $manager->addConnection([]);
        /**
         *  因微擎屏蔽了 数据库的连接配置信息 需要hack 一下
         */
        $manager->getDatabaseManager()->extend('default', function(){
            $connection = new \Illuminate\Database\MySqlConnection(pdo()->getPDO());
            return $connection;
        });


        $request = Laminas\Diactoros\ServerRequestFactory::fromGlobals(
            $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES
        );
        $responseFactory = new \Laminas\Diactoros\ResponseFactory();
        $strategy = new League\Route\Strategy\JsonStrategy($responseFactory);
        // 获取当前路由
        $res_m = $this->returnUri();
        $route   = $Route->setStrategy($strategy);
        //在这里dispatch分配路由的时候,本身代码没有第二个参数,这个是我自己加的,最下方我会贴出改造代码
        $response =  $route->dispatch($request, $res_m['url']);
        (new Laminas\HttpHandlerRunner\Emitter\SapiEmitter)->emit($response);
    }

    public function doWebAdminApi(){
        $adminRoute = include __DIR__ . '/routes/adminapi.php';
        $this->returnSet($adminRoute);
    }

然后 我的adminapi.php


$route = new League\Route\Router;
$route->group('/adminapi', function (\League\Route\RouteGroup $route) {
})

这里我只是贴个大概具体的话可以参考route.thephpleague.com/
本身laravel的改造是基于这个route来的,里面有关于控制器、中间件、接口等一些列改造方法。

dispatch改造代码。很简单

  public function dispatchRequest(ServerRequestInterface $request, $uri = ""): ResponseInterface
    {
        $method = $request->getMethod();
        // 这里的$url原本是实时获取,但是我的是微擎的格式,所以获取到的地址一直是错的,所以前面动态拼接微擎的url, 往这里传
        $uri    = $uri ? $uri : $request->getUri()->getPath();
        $match  = $this->dispatch($method, $uri);
        switch ($match[0]) {
            case FastRoute::NOT_FOUND:
                $this->setNotFoundDecoratorMiddleware();
                break;
            case FastRoute::METHOD_NOT_ALLOWED:
                $allowed = (array) $match[1];
                $this->setMethodNotAllowedDecoratorMiddleware($allowed);
                break;
            case FastRoute::FOUND:
                $route = $this->ensureHandlerIsRoute($match[1], $method, $uri)->setVars($match[2]);
                if ($this->isExtraConditionMatch($route, $request)) {
                    $this->setFoundMiddleware($route);
                    $request = $this->requestWithRouteAttributes($request, $route);
                    break;
                }
                $this->setNotFoundDecoratorMiddleware();
                break;
        }
        return $this->handle($request);
    }
4年前 评论
讨论数量: 9
颠倒的玉石

曾经我在微擎中加入了tp,可以使用但是上线卖钱的时候,有一大部分人反应安装失败

4年前 评论
WLLLL (楼主) 4年前
zhanghaidi

楼主研究一下微擎应用有款芸众商城的应用,是基于laravel5.3框架开发的,之前一直在做芸众商城二开,里面路由统一做了处理。用起来很方便,值得研究

4年前 评论

@zhanghaidi 芸众商城的应用,我在哪里能下载源码啊

4年前 评论
kyzx 4年前

@zhanghaidi 我刚去应用市场搜索 芸众商城,没搜到呀

4年前 评论
黑将军

你看看这个? github.com/tanmotop/larawe

4年前 评论
WLLLL (楼主) 4年前
kownn 4年前
WLLLL (楼主) 4年前
zhanghaidi

@WLLLL github.com/zhanghaidi/yun_shop 微擎和芸众闹掰了,商城下架了,现在没养微擎版了。上面是我之前的仓库你clone下来研究吧

4年前 评论
WLLLL (楼主) 4年前

前段时间一直在忙,所以没有贴答案,现在贴一下
参考链接:gitee.com/liushuai05/we7_test
下面是我site.php的代码

 public function returnUri(){
    global  $_GPC;
    $tpM = $_GPC['do'] ? $_GPC['do']:'index';
    $tpC = isset($_GPC['tp_c'])? $_GPC['tp_c']:'index';
    $tpC = strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $tpC), "_"));
    $tpA = isset($_GPC['tp_a'])? trim($_GPC['tp_a']):'index';
    return ['url'=>"/".$tpM."/".$tpC."/".$tpA, 'module'=>$tpM];
}

public function returnSet($Route){

        ob_clean(); //调试模式下 清除外部框架 的错误输出 要不会报错
        /**
         * @var $request Psr\Http\Message\ServerRequestInterface
         */
        $manager = new \Illuminate\Database\Capsule\Manager();
        $manager->setAsGlobal();
        $manager->bootEloquent(); //ORM
        // 微擎屏蔽了 数据库连接信息 直接强改pdo
        $manager->addConnection([]);
        /**
         *  因微擎屏蔽了 数据库的连接配置信息 需要hack 一下
         */
        $manager->getDatabaseManager()->extend('default', function(){
            $connection = new \Illuminate\Database\MySqlConnection(pdo()->getPDO());
            return $connection;
        });


        $request = Laminas\Diactoros\ServerRequestFactory::fromGlobals(
            $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES
        );
        $responseFactory = new \Laminas\Diactoros\ResponseFactory();
        $strategy = new League\Route\Strategy\JsonStrategy($responseFactory);
        // 获取当前路由
        $res_m = $this->returnUri();
        $route   = $Route->setStrategy($strategy);
        //在这里dispatch分配路由的时候,本身代码没有第二个参数,这个是我自己加的,最下方我会贴出改造代码
        $response =  $route->dispatch($request, $res_m['url']);
        (new Laminas\HttpHandlerRunner\Emitter\SapiEmitter)->emit($response);
    }

    public function doWebAdminApi(){
        $adminRoute = include __DIR__ . '/routes/adminapi.php';
        $this->returnSet($adminRoute);
    }

然后 我的adminapi.php


$route = new League\Route\Router;
$route->group('/adminapi', function (\League\Route\RouteGroup $route) {
})

这里我只是贴个大概具体的话可以参考route.thephpleague.com/
本身laravel的改造是基于这个route来的,里面有关于控制器、中间件、接口等一些列改造方法。

dispatch改造代码。很简单

  public function dispatchRequest(ServerRequestInterface $request, $uri = ""): ResponseInterface
    {
        $method = $request->getMethod();
        // 这里的$url原本是实时获取,但是我的是微擎的格式,所以获取到的地址一直是错的,所以前面动态拼接微擎的url, 往这里传
        $uri    = $uri ? $uri : $request->getUri()->getPath();
        $match  = $this->dispatch($method, $uri);
        switch ($match[0]) {
            case FastRoute::NOT_FOUND:
                $this->setNotFoundDecoratorMiddleware();
                break;
            case FastRoute::METHOD_NOT_ALLOWED:
                $allowed = (array) $match[1];
                $this->setMethodNotAllowedDecoratorMiddleware($allowed);
                break;
            case FastRoute::FOUND:
                $route = $this->ensureHandlerIsRoute($match[1], $method, $uri)->setVars($match[2]);
                if ($this->isExtraConditionMatch($route, $request)) {
                    $this->setFoundMiddleware($route);
                    $request = $this->requestWithRouteAttributes($request, $route);
                    break;
                }
                $this->setNotFoundDecoratorMiddleware();
                break;
        }
        return $this->handle($request);
    }
4年前 评论

开发微擎不建议用laravel ,或者说连TP最好都不要用,纯手撸,或者用微擎的框架。不然后面很麻烦,先不说改造框架的问题,一套TP或者laravel框架本身的大小就会导致你的用户下载应用时耗时增加,如果你再composer安装一些应用,啧啧啧。我们公司产品,从微擎下载下来再安装耗时4个小时,因为装了phpoffice,又装了腾讯云的composer,阿里的composer。下载速度真是感人。

4年前 评论

我看了楼上的代码 , 如果你真这么用,后面对你的折磨可能大于你项目的bug折磨,并且你的route:list无法正常使用,我之前尝试兼容过,并且兼容效率到了99+,不过需要改包,因为有一个文件在包里面,无法使用容器替换,直接new出来的 ,与其在微擎中写laravel不如在laravel中写laravel , 感知不到微擎的存在就好

4年前 评论
薄荷蓝的晴天 4年前
WLLLL (楼主) 4年前
陈先生 (作者) 4年前
WLLLL (楼主) 4年前
陈先生 (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!