lumen切换 nikic/fast-route 为 illuminate/routing

2020-06-23 17:07:14 浏览数 (1)

为啥会有这个想法呢?原因有如下几个:

  1. 组件已经许久不更新了。
  2. 组件在使用时有功能限制
  3. 在安装 laravel 第三方组件时如果有相关 routing 功能可能会不支持一些功能,比如 Route:prefix()

好了,接下来就开始干吧。

安装之前先说一下注意事项:

  1. 该方法只适合使用自带路由的情况。如果安装了dingo/api的情况,情况并不适合。

下面我们就以 lumen7.0 为例进行讲解。

首先安装laravel的路由组件

代码语言:txt复制
composer require illuminate/routing

接下来我们要替换路由组件。通过读取相关源码,我们知道注册路由组件是通过LaravelLumenApplication::bootstrapRouter()进行注册的。

所以接下来我们就是需要将该方法进行替换。

首先我们先创建一个文件。目前就把文件命名为appHttpKernel.php

然后将以下内容复制到该文件:

代码语言:txt复制
// file: appHttpKernel.php
namespace AppHttp;

use IlluminateRoutingRouter;
use IlluminateRoutingRoutingServiceProvider;
use LaravelLumenApplication;

class Kernel extends Application
{
    /**
     * The Router instance.
     *
     * @var Router
     */
    public $router;

    /**
     * Bootstrap the router instance.
     *
     * @return void
     */
    public function bootstrapRouter() {
        $this->register(RoutingServiceProvider::class);
        $this->router = $this['router'];
        $this->router->middlewareGroup("web", []);
    }
}

然后替换bootstrapapp.php中实例化Application的方法。

代码语言:txt复制
$app = new AppHttpKernel(
    dirname(__DIR__)
);

运行一下,出现如下错误:

代码语言:txt复制
Cannot use object of type IlluminateRoutingRouteCollection as array

这是在解析路由的时候出现了问题。

接下来我就再次重写相关方法来实现该功能:

代码语言:txt复制
// file: appHttpKernel.php
namespace AppHttp;

use IlluminateHttpResponse;
use IlluminateRoutingRouter;
use IlluminateRoutingRoutingServiceProvider;
use LaravelLumenApplication;
use SymfonyComponentHttpFoundationRequest as SymfonyRequest;

class Kernel extends Application
{
    /**
     * The Router instance.
     *
     * @var Router
     */
    public $router;

    /**
     * Bootstrap the router instance.
     *
     * @return void
     */
    public function bootstrapRouter() {
        $this->register(RoutingServiceProvider::class);
        $this->router = $this['router'];
        $this->router->middlewareGroup("web", []);
    }

    /**
     * Dispatch the incoming request.
     *
     * @param  SymfonyRequest|null  $request
     * @return Response
     */
    public function dispatch($request = null)
    {
        $this->parseIncomingRequest($request);

        try {
            $this->boot();

            return $this->sendThroughPipeline($this->middleware, function ($request) {
                $this->app->instance('request', $request);

                return $this->router->dispatch($request);
            });
        } catch (Throwable $e) {
            return $this->prepareResponse($this->sendExceptionToHandler($e));
        }
    }
}

再次运行一下,出现如下错误:

代码语言:txt复制
Undefined property: IlluminateRoutingRouter::$app

这是因为之前在路由文件中$router是LaravelLumenRoutingRouter,目前已经更换为IlluminateRoutingRouter。该类中没有相关方法。

那么我们修改代码如下:

代码语言:txt复制
// file: routesweb.php

use IlluminateSupportFacadesRoute;

Route::get('/', function () {
    return app()->version();
});

这样就替换成功了。

0 人点赞