Laravel 5.4 - 如何覆盖包中定义的路由?

Posted

技术标签:

【中文标题】Laravel 5.4 - 如何覆盖包中定义的路由?【英文标题】:Laravel 5.4 - How to override route defined in a package? 【发布时间】:2017-11-27 04:05:18 【问题描述】:

我在 Laravel 5.4 中创建了一个用于设置基本后台的包。这个包包含几个使用包内控制器的路由。我想要做的是在我的应用程序中覆盖包定义的路由,以便插入自定义控制器。例如,如果我有一条路线

        Route::get('login', [
            'as' => 'admin.login',
            'uses' => 'Auth\LoginController@showLoginForm'
        ]);

在我的包中定义将使用Vendor\Package\Controllers\Auth\LoginController 我想为我的应用程序定义一个路由,该路由将覆盖该路由并使用App\Controllers\Auth\LoginController

在应用程序路由文件中定义路由的明显方法失败了,因为应用程序路由文件在包路由文件之前运行,因此以包定义为准。

有什么方法可以完成这种事情吗?

我还尝试在RouteServiceProvider 中获取特定路由并使用方法uses 来设置应该用来解决它的控制器,像这样

public function boot()
    
        parent::boot();
        Route::get('admin.login')->uses('App\Http\Controllers\Admin\Auth\LoginController@showLoginForm');
    

但这也无法完成假装的事情。

关于我做错了什么的任何线索?

【问题讨论】:

【参考方案1】:

另一个选项——不必与服务提供者的顺序冲突——是为控制器添加一个绑定。 所以例如在 AppServiceProvider 中,

$this->app->bind(
    \Vendor\Package\Controllers\Auth\LoginController::class,
    App\Controllers\Auth\LoginController::class
);

您必须匹配控制器方法名称,但您已经在示例中这样做了。

(关于这个答案的警告:我没有在 Laravel 5.4 中对其进行测试,但我只是在 Laravel 6.0 中使用 Laravel 5.6 中添加的 $bindings 属性进行了此操作。也就是说,这应该是正确的 5.4 语法同样的事情)。

编辑:对于 Laravel 6+,您可以改为将绑定添加到 AppServiceProvider 中的绑定数组:

public $bindings = [
    \Vendor\Package\Controllers\Auth\LoginController::class =>
        App\Controllers\Auth\LoginController::class,
    // other bindings
]

【讨论】:

【参考方案2】:

providers 数组的 config/app.php 中,将包的服务提供者放在 App\Providers\RouteServiceProvider::class, 之前,然后在您的 web.php 路由中能够用您的自定义路由覆盖它。

编辑 对于 Laravel 包自动发现,您可以在 composer.json 中禁用自动发现的包,如下所示:

"extra": 
    "laravel": 
        "dont-discover": [
            "barryvdh/laravel-debugbar"
        ]
    
,

在此示例中,barryvdh/laravel-debugbar 包不会被自动发现,这意味着您必须手动将其服务提供程序包含在配置数组中,然后您才能按所需顺序重新排列您的自定义提供程序。

【讨论】:

如果你想覆盖一个包路由,那么你必须在你的路由提供者之后列出服务提供者。 @JeffPuckett,如果你想覆盖一个包裹路线,你的路线必须在包裹路线之后,所以你的包裹供应商必须在之前 路线提供者。 我认为我们在争论不同的观点。我们可以同意先注册的路由优先吗?这似乎是 5.5 中的行为 我们将如何使用自动包发现来做到这一点?

以上是关于Laravel 5.4 - 如何覆盖包中定义的路由?的主要内容,如果未能解决你的问题,请参考以下文章

升级到 5.4 后在 Laravel BrowserKit 包中找不到 PHPUnit\Framework\Constraint\Constraint

laravel 5.4在请求中验证之前修改数据[关闭]

Laravel 在包中使用自定义 USER-Model

laravel 包中路由声明的顺序

Laravel 5.4:从 CSRF 验证中排除带有参数的路由

Laravel 5.4:API 路由列表