我今天也有同样的问题。经过一番研究,我找到了一个对核心类影响最小的解决方案。
注意:以下描述基于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。在这种情况下,只需一个包含dd() 的构造函数来演示,如果要使用新的Routerist。
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__)
);
适当的解决方案
Application 的 $router 属性是公共属性。您可以简单地将您的自定义 Router 实例分配给它。
在Application 实例化之后,在您的bootstrap/app.php 中放置一个
$app->router = new \App\Routing\Router;
完成。