簡體   English   中英

我可以使用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']);

我希望能夠在/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執行此操作的方法將允許為每個路由設置此優先級,因此我不只是在應用程序之前加載所有包路由。

您應該能夠通過更改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()方法將始終在RouteServiceProviderboot()方法之前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']);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM