で語られたことLaravel Doc
場合によっては、一度だけ解決する必要のあるものをコンテナーにバインドし、コンテナーへの後続の呼び出しで同じインスタンスを返す必要がある場合があります。
singleton
これはオブジェクトをバインドする方法であり、正しく実行できました
App::singleton('foo', function()
{
return new FooBar;
});
しかし、問題は、あなたが と のプロセス全体を間違った方法で考えてrequest
いるresponse
ことです。あなたはそれを言った、
ブラウザでページを更新するたびに、オブジェクトが作成されていることがわかります。
HTTP
ページを更新するたびに、新しいリクエストを送信し、アプリケーションが起動して送信したリクエストを処理し、最後にアプリケーションが応答を送信するたびに、これはリクエストの正常な動作です。ブラウザでは、ジョブは終了し、サーバーには何も保持されません (セッション、Cookie は永続的で、この場合は異なります)。
さて、the same instance should be returned on subsequent calls
この場合、後続の呼び出しはApp::make(...)
、アプリケーションの単一のライフ サイクルで、同じ要求で複数回呼び出すと、毎回新しいインスタンスが作成されないことを意味すると言われています。たとえば、2回呼び出すと、次のようになります
App::before(function($request)
{
App::singleton('myApp', function(){ ... });
});
同じリクエストで、コントローラーで、最初に呼び出します
class HomeController {
public function showWelcome()
{
App::make('myApp'); // new instance will be returned
// ...
}
}
そして、もう一度after
フィルターで2回呼び出します
App::after(function($request, $response)
{
App::make('myApp'); // Application will check for an instance and if found, it'll be returned
});
この場合、両方の呼び出しが同じリクエストで発生しました。シングルトンであるため、コンテナーは最初の呼び出しでインスタンスを 1 つだけ作成し、後で使用するためにインスタンスを保持し、後続の呼び出しで同じインスタンスを返します。