2

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

4

1 回答 1

3

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

注意:以下描述基于Lumen 6.2

在你开始之前; 考虑一个合适的解决方案,使用中间件

由于该框架的性质,如果Router不扩展核心类和修改引导程序,就无法使用自定义。

按照以下步骤自定义Router

哈克解决方案

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. 在这种情况下,只需一个包含 a 的构造函数dd()来演示,如果Router要使用新的 ist。

2. 扩展Application

常规Router将在没有任何绑定或依赖注入的情况下在Application::__construct. 因此,您不能覆盖它的类绑定。我们必须修改这个初始化过程。幸运的是,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__)
);

适当的解决方案

$router财产Application是公共财产。您可以简单地将自定义实例分配Router给它。

Application在你的bootstrap/app.php地方实例化之后

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

完毕。

于 2019-12-17T23:31:57.743 回答