我可以使用 Laravel 5 中间件来允许包覆盖应用程序路由吗?

Posted

技术标签:

【中文标题】我可以使用 Laravel 5 中间件来允许包覆盖应用程序路由吗?【英文标题】:Can I use Laravel 5 Middleware to allow packages to override app routes? 【发布时间】:2015-05-04 02:59:12 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您应该可以通过更改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']);
    

【讨论】:

感谢您的建议,唯一的问题是它适用于包中的所有路由,因此我无法为每个路由定义不同的优先级。 是的,没错。我不知道这是否可能,因为路由是在RouteServiceProvider 的引导方法中加载的。如果我发现了什么,我会告诉你...

以上是关于我可以使用 Laravel 5 中间件来允许包覆盖应用程序路由吗?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 从包服务提供者注册中间件

3 级认证/中间件 Laravel

Laravel 5.1 使用默认身份验证控制器和中间件尝试使用额外参数进行身份验证

带有角度路由的 Laravel 5 中间件

中间件身份验证不适用于 Web Laravel 5.2

[ Laravel 5.5 文档 ] 处理用户请求 —— HTTP 请求的过滤器:中间件