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

时间:2017-06-23 14:22:23

标签: php laravel laravel-5.4 laravel-routing

我在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');
    }

但这也无法实现假装。

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

2 个答案:

答案 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语法一样)。