我在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');
}
但这也无法实现假装。
关于我做错了什么的线索?
答案 0 :(得分:12)
在 providers 数组中的 config / app.php 中,将包的服务提供商放在App\Providers\RouteServiceProvider::class,
之前,然后放在web.php
路由中您可以使用自定义路线覆盖它。
答案 1 :(得分:0)
另一个选择-不必为服务提供者的顺序搞混-为控制器添加绑定。 所以例如在AppServiceProvider中,
$this->app->bind(
\Vendor\Package\Controllers\Auth\LoginController::class,
App\Controllers\Auth\LoginController::class
);
您必须匹配控制器方法名称,但是您已经在示例中这样做了。
(关于这个答案的警告:我还没有在Laravel 5.4中对其进行测试,但是我只是在Laravel 6.0中使用了Laravel 5.6中添加的$ bindings属性进行了测试。也就是说,这应该是正确的5.4语法一样)。