5

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

4

1 回答 1

8

您应该能够通过更改服务提供者的顺序来更改路由注册的顺序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']);
    }
}
于 2015-03-03T12:49:22.823 回答