我希望能够用包中的路由覆盖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']);
}
}