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

Ant*_*ado 8 php laravel laravel-routing laravel-5.4

我在Laravel 5.4中创建了一个包,它建立了一个基本的后台.此程序包包含几个使用程序包内的控制器的路径.我想要做的是覆盖我的应用程序中包定义的路由,以插入自定义控制器.例如,如果我有路线

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

在我的包中定义,将使用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');
    }
Run Code Online (Sandbox Code Playgroud)

但这也无法实现假装.

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

the*_*len 17

提供者数组中的config/app.php中,先将包的服务提供者放入您的路由,然后在您的路由中,您将能够使用自定义路由覆盖它.App\Providers\RouteServiceProvider::class,web.php


小智 9

另一种选择——不必与服务提供者的顺序混淆——是为控制器添加一个绑定。例如在 AppServiceProvider 中,

$this->app->bind(
    \Vendor\Package\Controllers\Auth\LoginController::class,
    App\Controllers\Auth\LoginController::class
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

public $bindings = [
    \Vendor\Package\Controllers\Auth\LoginController::class =>
        App\Controllers\Auth\LoginController::class,
    // other bindings
]
Run Code Online (Sandbox Code Playgroud)