我可以使用Laravel 5中间件来允许包覆盖应用程序路由吗


Can I use Laravel 5 Middleware to allow packages to override app routes?

我希望能够用包中的路由覆盖app/Http/routes.php中定义的路由。

例如,在app/Http/routes.php中,我可能有以下内容:

Route::get('/search/{type?}',['as' => 'search','uses' => 'SearchController@search']);

我希望能够在/vender/author/package/src/Http/routes.php:中定义这一点

Route::get('/search/properties', ['as' => 'properties','uses' => 'PropertyController@search']);

首先加载app/Http/routes.php文件,因此使用它们中的路由,而不是包。

在Laravel 4中,我会使用App::before或App::after来实现这一点,并给它们一个优先级。

像这样在包裹路线:

App::before(function() {
    Route::get('/search/properties', ['as' => 'properties','uses' => 'PropertyController@search']);
});

我不知道如何在Laravel 5中实现这一点。我发现了这个https://mattstauffer.co/blog/laravel-5.0-middleware-filter-style,但不知道如何使用它来做我想做的事。

编辑:Laravel 4的方法允许按路线设置优先级,所以我不仅仅是在应用程序之前加载所有的包裹路线。

您应该能够通过更改config/app.php中服务提供商的顺序来更改路由的注册顺序。

目前,它可能看起来有点像这样:

'providers' => [
    // ...
    'App'Providers'RouteServiceProvider',
    // ...
    'Vendor'Package'PackageServiceProvider',
],

现在只需更改订单,以便首先加载包裹:

'providers' => [
    // ...
    'Vendor'Package'PackageServiceProvider',  // register package routes first
    'App'Providers'RouteServiceProvider',
    // ...
],

要仅对特定路由进行优先级排序,您可以(ab)使用服务提供商register()方法。我真的不喜欢这个方法,但它有效,我找不到更好的了。。。

当加载服务提供者时,调用每个提供者的register()方法。然后(按相同顺序)采用boot()方法。这意味着,与提供者的顺序无关,包中的register()方法将始终在RouteServiceProvider中的boot()方法之前调用。这可能看起来有点像:

class PackageServiceProvider extends ServiceProvider {
    public function boot(){
        // register the regular package routes
    }
    public function register(){
        // register route "overrides"
        // for example like this: (obviously you could also load a file)
        app('router')->get('/search/properties', ['as' => 'properties','uses' => 'PropertyController@search']);
    }
}