7

シングルトン オブジェクトを作成して Laravel IoC を使用しようとしています。以下のチュートリアルのパターンに従っています。Log メッセージをオブジェクト (この例では Foobar) コンストラクターに入れました。ブラウザーでページを更新するたびに、オブジェクトが作成されていることがわかります。Laravels IoC のシングルトン パターンはどのように意味されますか? アプリケーション全体の共有オブジェクトであることは理解しましたが、 App:make(...) によって要求されるたびに明らかに作成されています。誰か説明してください。共有 MongoDB 接続を維持するためにシングルトン パターンを使用すると考えました。

App::singleton('foo', function()
{
    return new FooBar;
});
4

2 に答える 2

34

で語られたこと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 つだけ作成し、後で使用するためにインスタンスを保持し、後続の呼び出しで同じインスタンスを返します。

于 2013-06-28T03:13:07.250 に答える
-1

アプリケーションインスタンス全体で複数回使用することを意図しています。ページを更新するたびに、アプリケーションの新しいインスタンスになります。

詳細と実際の使用法については、こちらをご覧ください: http://codehappy.daylerees.com/ioc-container

L3用に書かれていますが、L4も同様です。

于 2013-06-27T21:07:59.053 に答える