我可以使用 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',
// ...
],
要仅对特定路线进行优先排序,您可以(滥用)使用服务提供商 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']);
}
}
我希望能够用包中的路由覆盖 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',
// ...
],
要仅对特定路线进行优先排序,您可以(滥用)使用服务提供商 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']);
}
}