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

时间:2015-03-03 12:44:21

标签: php laravel laravel-routing laravel-5 laravel-middleware

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

例如,在app / Http / routes.php中,我可能会这样:

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

我希望能够在/vendor/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这样做的方法是允许为每条路线设置此优先级,所以我不只是在应用程序之前加载所有包路由。

1 个答案:

答案 0 :(得分:7)

您应该可以通过更改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()方法始终会在boot()中的RouteServiceProvider方法之前调用。这可能看起来像这样:

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