web-dev-qa-db-ja.com

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

しかし、これはまた、ふりをすることを達成することに失敗します。

私が間違っていることについての手がかりはありますか?

8

config/app.phpproviders配列で、パッケージのサービスプロバイダーをApp\Providers\RouteServiceProvider::class,の前に置きます。 web.phpルートでは、カスタムルートでオーバーライドできます。

[〜#〜] edit [〜#〜] Laravelパッケージの自動検出の場合、次のようにcomposer.jsonで自動検出されるパッケージを無効にできます。

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

この例では、barryvdh/laravel-debugbarパッケージは自動検出されません。つまり、構成配列にサービスプロバイダーを手動で含める必要があります。そうすれば、カスタムプロバイダーを目的の順序に並べ替えることができます。

17
thefallen

別のオプション(サービスプロバイダーの順序をいじくり回す必要はありません)は、コントローラーのバインディングを追加することです。だから例えばAppServiceProviderでは、

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

コントローラのメソッド名を一致させる必要がありますが、例ではすでに一致しています。

(この回答に関する警告:Laravel 5.4でテストしていませんが、追加された$ bindingsプロパティを使用してLaravel 6.0でテストしました。 in Laravel 5.6。とはいえ、これは同じことを行うための正しい5.4構文であるはずです)。

1
Chris Tyler