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
]
我在 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
]