Lumen 切换 nikic/fast-route 为 illuminate/routing
为啥会有这个想法呢?原因有如下几个:
- 组件已经许久不更新了。
- 组件在使用时有功能限制
- 在安装
laravel
第三方组件时如果有相关routing
功能可能会不支持一些功能,比如Route:prefix()
。
好了,接下来就开始干吧。
安装之前先说一下注意事项:
- 该方法只适合使用自带路由的情况。如果安装了
dingo/api
的情况,情况并不适合。
下面我们就以 lumen7.0
为例进行讲解。
首先安装laravel的路由组件
composer require illuminate/routing
接下来我们要替换路由组件。通过读取相关源码,我们知道注册路由组件是通过Laravel\Lumen\Application::bootstrapRouter()
进行注册的。
所以接下来我们就是需要将该方法进行替换。
首先我们先创建一个文件。目前就把文件命名为app\Http\Kernel.php
。
然后将以下内容复制到该文件:
// file: app\Http\Kernel.php
namespace App\Http;
use Illuminate\Routing\Router;
use Illuminate\Routing\RoutingServiceProvider;
use Laravel\Lumen\Application;
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", []);
}
}
然后替换bootstrap\app.php
中实例化Application
的方法。
$app = new \App\Http\Kernel(
dirname(__DIR__)
);
运行一下,出现如下错误:
Cannot use object of type Illuminate\Routing\RouteCollection as array
这是在解析路由的时候出现了问题。
接下来我就再次重写相关方法来实现该功能:
// file: app\Http\Kernel.php
namespace App\Http;
use Illuminate\Http\Response;
use Illuminate\Routing\Router;
use Illuminate\Routing\RoutingServiceProvider;
use Laravel\Lumen\Application;
use Symfony\Component\HttpFoundation\Request 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));
}
}
}
再次运行一下,出现如下错误:
Undefined property: Illuminate\Routing\Router::$app
这是因为之前在路由文件中$router是Laravel\Lumen\Routing\Router
,目前已经更换为Illuminate\Routing\Router
。该类中没有相关方法。
那么我们修改代码如下:
// file: routes\web.php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return app()->version();
});
这样就替换成功了。
本作品采用《CC 协议》,转载必须注明作者和本文链接