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');
}
しかし、これはまた、ふりをすることを達成することに失敗します。
私が間違っていることについての手がかりはありますか?
config/app.phpのproviders配列で、パッケージのサービスプロバイダーをApp\Providers\RouteServiceProvider::class,
の前に置きます。 web.php
ルートでは、カスタムルートでオーバーライドできます。
[〜#〜] edit [〜#〜] Laravelパッケージの自動検出の場合、次のようにcomposer.json
で自動検出されるパッケージを無効にできます。
"extra": {
"laravel": {
"dont-discover": [
"barryvdh/laravel-debugbar"
]
}
},
この例では、barryvdh/laravel-debugbar
パッケージは自動検出されません。つまり、構成配列にサービスプロバイダーを手動で含める必要があります。そうすれば、カスタムプロバイダーを目的の順序に並べ替えることができます。
別のオプション(サービスプロバイダーの順序をいじくり回す必要はありません)は、コントローラーのバインディングを追加することです。だから例えば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構文であるはずです)。