laravel容器の遅延荷重及びauth拡張の詳細
昨日マニュアルの教程に従って、Auth拡張を書いて、バッグの独立性の原則によって、Auth:exted()という方法をstart.phpに書いてほしくないです。もちろん、サービス提供器register()の方法に拡張ドライバを登録することを選択しました。しかし、思いとは違っています。
問題を発見する
Loauth ServiceProviderに書いた時:
その時、気がふさいで、原因を探して、Authが登録していないのではないかと疑っています。確認して登録しました。ルートで使えます。php arisan clear-compledは役に立たないです。百思はその解を得られないで、甚だしきに至っては私がうっかり核心の種類を改正したのだと疑って、また再度laravelの包みをダウンロードして、問題はもとのままです。
一晩苦しめましたが、最終的にはAuthServiceProviderのドルdeferプロパティに目を留めました。
マニュアルとコメントによると、私たちは$defer属性がサービスプロバイダのローディングを遅延させるために使用されていることを知りました。つまり、直接的に言えば、register()の実行を遅延させる方法であり、provides()方法に協力するだけで実現できます。例を挙げます
核心を定める
問題が来ました。受動的な遅延負荷である以上、つまりAuthの方法を呼び出すとAuthの種類が自動的に実例化されるはずです。なぜ私はLoauthServiceProviderで呼び出した時に方法が存在しないということですが、ルートでは可能ですか?
優先度の問題で、LoauthServiceProviderをフレームに登録する可能性があります:register()の場合、Authはまだ遅延負荷としてマークされていません。これは先着的な問題を引き起こしました。どの即時ローディングサービスプロバイダもRegister方法で遅延ローディングサービスを起動できません。
研究を経て、コアコードの中で順調に証拠を見つけました。Illuminate\Foundation\Provider Repository
問題の所在を発見しましたが、問題解決を代表していません。コアコードを修正するのは賢明な選択ではないので、私達自身のカバンの中で方法を考えるしかないです。一つの解決案は以下の通りです。
以上が本文の全部です。お好きになってください。
問題を発見する
Loauth ServiceProviderに書いた時:
public function register()
{
//
\Auth::extend('loauth',function($app){});
}
エラーを申し込む
Call to undefined method Illuminate\Support\Facades\Auth::extend()
原因を尋ねるその時、気がふさいで、原因を探して、Authが登録していないのではないかと疑っています。確認して登録しました。ルートで使えます。php arisan clear-compledは役に立たないです。百思はその解を得られないで、甚だしきに至っては私がうっかり核心の種類を改正したのだと疑って、また再度laravelの包みをダウンロードして、問題はもとのままです。
一晩苦しめましたが、最終的にはAuthServiceProviderのドルdeferプロパティに目を留めました。
マニュアルとコメントによると、私たちは$defer属性がサービスプロバイダのローディングを遅延させるために使用されていることを知りました。つまり、直接的に言えば、register()の実行を遅延させる方法であり、provides()方法に協力するだけで実現できます。例を挙げます
public function provides()
{
return array('auth');
}
これはAuthServiceProvider内の方法で、フレームが初期化されると、サービス提供器を順次ロードします。このサービス提供器protected$defer=trueを見つけたら、そのprovidesメソッドを呼び出します。その帰りの配列には遅延負荷が必要なサービス名が含まれています。コントローラまたは他の場所でAuth:METHOD()を呼び出すと、プロバイダのRegister()メソッドを呼び出すことができます。核心を定める
問題が来ました。受動的な遅延負荷である以上、つまりAuthの方法を呼び出すとAuthの種類が自動的に実例化されるはずです。なぜ私はLoauthServiceProviderで呼び出した時に方法が存在しないということですが、ルートでは可能ですか?
優先度の問題で、LoauthServiceProviderをフレームに登録する可能性があります:register()の場合、Authはまだ遅延負荷としてマークされていません。これは先着的な問題を引き起こしました。どの即時ローディングサービスプロバイダもRegister方法で遅延ローディングサービスを起動できません。
研究を経て、コアコードの中で順調に証拠を見つけました。Illuminate\Foundation\Provider Repository
public function load(Application $app, array $providers)
{
//...
// We will go ahead and register all of the eagerly loaded providers with the
// application so their services can be registered with the application as
// a provided service. Then we will set the deferred service list on it.
foreach ($manifest['eager'] as $provider)
{
$app->register($this->createProvider($app, $provider));
}
//
$app->setDeferredServices($manifest['deferred']);
}
解決の道問題の所在を発見しましたが、問題解決を代表していません。コアコードを修正するのは賢明な選択ではないので、私達自身のカバンの中で方法を考えるしかないです。一つの解決案は以下の通りです。
public function register()
{
//
$authProvider = new \Illuminate\Auth\AuthServiceProvider($this->app);
$authProvider->register();
\Auth::extend('loauth',function($app){});
}
authはまだ登録されていないので、私達は手動でそのregister方法を呼び出して登録してください。以上が本文の全部です。お好きになってください。