Lumen/Laravel - 使用自定义路由器

Lumen/Laravel - use custom router

是否有任何开箱即用的解决方案,无需更改内核即可将自定义路由器添加到 laravel 或 lumen。我已经知道 lumen 使用的路由器与 laravel 不同,所以我想知道是否有可能在核心中内置更改路由器?

我今天也有同样的问题。经过一些研究,我找到了一个对核心影响最小的解决方案 classes。

Note: The following description is based on Lumen 6.2.

Before you start; think about a proper solution, using a middleware.

由于此框架的性质,如果不扩展核心 classes 和修改 bootstrap.

,则无法使用自定义 Router

按照这些步骤进行自定义 Router

Hacky 解决方案

1。创建您的自定义 Router.

提示:在本例中,App 将是 Lumen 项目的根命名空间。

<?php

namespace App\Routing;

class Router extends \Laravel\Lumen\Routing\Router
{
    public function __construct($app)
    {
        dd('This is my custom router!');
        parent::__construct($app);
    }
}

没有Interface或类似的,所以你必须扩展现有的Router。在这种情况下,只有一个包含 dd() 的构造函数来演示,如果要使用新的 Routerist。

2。扩展 Application

常规 Router 将在 Application::__construct 内的方法调用中进行初始化,而无需任何绑定或依赖注入。因此,您不能为它覆盖 class 绑定。我们必须修改这个初始化过程。幸运的是,Lumen 正在使用一种仅用于路由器初始化的方法。

<?php

namespace App;

use App\Routing\Router;

class Application extends \Laravel\Lumen\Application
{
    public function bootstrapRouter()
    {
        $this->router = new Router($this);
    }
}

3。告诉 Lumen 使用我们的 Application

Application 的实例是在我们的 bootstrap/app.php.

的顶部相对靠近创建的

找到看起来像

的代码块
$app = new Laravel\Lumen\Application(
    dirname(__DIR__)
);

并将其更改为

$app = new App\Application(
    dirname(__DIR__)
);

正确的解决方案

Application$router属性是public属性。您可以简单地将您的自定义 Router 实例分配给它。

实例化 Application 之后,在您的 bootstrap/app.php 中放置一个

$app->router = new \App\Routing\Router;

完成。