Laravel 5.4-如何覆盖包中定义的路由? [英] Laravel 5.4 - How to override route defined in a package?

查看:340
本文介绍了Laravel 5.4-如何覆盖包中定义的路由?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在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');
    }

但是这也无法完成假装.

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

解决方案

providers 数组的 config/app.php 中,将包的服务提供者放在App\Providers\RouteServiceProvider::class,,然后在您的web.php路线中,您可以使用自定义路线覆盖它.

编辑 对于Laravel软件包自动发现,您可以像这样禁用在composer.json中自动发现的软件包:

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

在此示例中,不会自动发现barryvdh/laravel-debugbar软件包,这意味着您必须手动将其服务提供程序包括在config数组中,然后才能按所需顺序重新排列自定义提供程序. /p>

I have created a package in Laravel 5.4 that sets up a basic backoffice. This package contains several routes that are using controllers from within the package. What I want to be able to do is to override the package defined routes in my application in order to plug custom controllers. For example, if I have a route

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

defined in my package that will use the Vendor\Package\Controllers\Auth\LoginController I want to defined a route for my application that will override that one and use the App\Controllers\Auth\LoginController.

Doing the obvious approach of defining the route in app routes files fails for the app routes files are run before the package routes file, so the package definition will prevail.

Is there any way to accomplish something of this kind?

I also tried to get the particular route in the RouteServiceProvider and use the method uses to set the controller that should be used to resolve it, like this

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

but this also fails to accomplish what is pretended.

Any clues on what I am doing wrong?

解决方案

In config/app.php in the providers array put the service provider of the package before App\Providers\RouteServiceProvider::class, and then in your web.php routes you'll be able to override it with your custom route.

EDIT For Laravel package auto discovery you can disable the package being auto discovered in your composer.json like this:

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

In this example the barryvdh/laravel-debugbar package won't be autodiscovered, which means you would have to manually include its service provider in the config array and then you'll be able to rearrange your custom provider in the desired order.

这篇关于Laravel 5.4-如何覆盖包中定义的路由?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆