2015-03-03 29 views
3

我希望能够覆盖app/Http/routes.php中定义的路由与包中的路由。我可以使用Laravel 5 Middleware来允许程序包覆盖应用程序路线吗?

例如,在应用程序/ HTTP/routes.php文件我可能有这样的:

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

我希望能够在/vendor/author/package/src/Http/routes.php定义此:

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

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

在Laravel 4中,我会使用App :: before或App :: after来做到这一点,给他们一个优先。

像这样的包装路线:

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

我不知道如何在Laravel 5.实现这一目标,我发现这个https://mattstauffer.co/blog/laravel-5.0-middleware-filter-style,但不知道如何使用,这样做我想要什么。

编辑:这样做的Laravel 4的方式将允许每个路由设置此优先级,所以我不只是加载应用程序之前的所有包路线。

回答

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()方法将始终在方法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' => '[email protected]']); 
    } 
} 
+0

感谢您的建议,唯一的问题是它将适用于包中的所有路由,所以我无法为每个路由定义不同的优先级。 – 2015-03-03 12:52:39

+0

是的,这是正确的。我不知道这是甚至可能的,因为路由被加载到'RouteServiceProvider'的启动方法中。如果我找到一些东西,我会告诉你... – lukasgeiter 2015-03-03 12:56:49

相关问题