为啥会有这个想法呢?原因有如下几个:
- 组件已经许久不更新了。
- 组件在使用时有功能限制
- 在安装
laravel
第三方组件时如果有相关routing
功能可能会不支持一些功能,比如Route:prefix()
。
好了,接下来就开始干吧。
安装之前先说一下注意事项:
- 该方法只适合使用自带路由的情况。如果安装了
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
的方法。
$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();
});
这样就替换成功了。