前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >lumen切换 nikic/fast-route 为 illuminate/routing

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

原创
作者头像
魔王卷子
修改2020-06-23 17:07:14
1.1K0
修改2020-06-23 17:07:14
举报

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

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

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

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

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

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

首先安装laravel的路由组件

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

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

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

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

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

代码语言:txt
复制
// 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的方法。

代码语言:txt
复制
$app = new \App\Http\Kernel(
    dirname(__DIR__)
);

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

代码语言:txt
复制
Cannot use object of type Illuminate\Routing\RouteCollection as array

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

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

代码语言:txt
复制
// 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));
        }
    }
}

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

代码语言:txt
复制
Undefined property: Illuminate\Routing\Router::$app

这是因为之前在路由文件中$router是Laravel\Lumen\Routing\Router,目前已经更换为Illuminate\Routing\Router。该类中没有相关方法。

那么我们修改代码如下:

代码语言:txt
复制
// file: routes\web.php

use Illuminate\Support\Facades\Route;

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

这样就替换成功了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档