Laravel 5.4 - 如何覆盖包中定义的路由?

Laravel 5.4 - How to override route defined in a package?

我在 Laravel 5.4 中创建了一个包,用于设置基本后台。这个包包含几个使用包内控制器的路由。我想要做的是覆盖我的应用程序中包定义的路由,以便插入自定义控制器。例如,如果我有一条路线

        Route::get('login', [
            'as' => 'admin.login',
            'uses' => 'Auth\LoginController@showLoginForm'
        ]);

在我的包中定义,将使用 Vendor\Package\Controllers\Auth\LoginController 我想为我的应用程序定义一个路由,该路由将覆盖该路由并使用 App\Controllers\Auth\LoginController.

在应用程序路由文件中定义路由的明显方法失败,因为应用程序路由文件在包路由文件之前 运行,因此以包定义为准。

有什么办法可以完成这样的事情吗?

我也尝试在 RouteServiceProvider 中获取特定的路由,并使用方法 uses 设置应该用于解析它的控制器,就像这样

public function boot()
    {
        parent::boot();
        Route::get('admin.login')->uses('App\Http\Controllers\Admin\Auth\LoginController@showLoginForm');
    }

但这也未能实现假装的目标。

关于我做错了什么的任何线索?

config/app.php中的providers数组中将包的服务提供商放在[之前=11=] 然后在你的 web.php 路线中你将能够用你的自定义路线覆盖它。

编辑 对于 Laravel 包自动发现,您可以像这样禁用 composer.json 中自动发现的包:

"extra": {
    "laravel": {
        "dont-discover": [
            "barryvdh/laravel-debugbar"
        ]
    }
},

在此示例中,不会自动发现 barryvdh/laravel-debugbar 包,这意味着您必须手动将其服务提供商包含在配置数组中,然后您就可以在所需顺序。

另一种选择——不必影响服务提供商的顺序——是为控制器添加绑定。 所以例如在 AppServiceProvider 中,

$this->app->bind(
    \Vendor\Package\Controllers\Auth\LoginController::class,
    App\Controllers\Auth\LoginController::class
);

您必须匹配控制器方法名称,但您已经在您的示例中这样做了。

(关于这个答案的警告:我没有在 Laravel 5.4 中测试它,但我只是在 Laravel 6.0 中使用在 [= 中添加的 $bindings 属性 22=]。也就是说,这应该是正确的 5.4 语法来做同样的事情)。

编辑:对于 Laravel 6+,您可以改为将绑定添加到 AppServiceProvider 中的绑定数组:

public $bindings = [
    \Vendor\Package\Controllers\Auth\LoginController::class =>
        App\Controllers\Auth\LoginController::class,
    // other bindings
]