2016-05-26 19 views
1

私はLaravel Frameworkバージョン5.2.32を使用しています。すべてのコントローラにオブジェクトがアクセス可能なシングルトンクラスを作成したいと思います。私は以下のようにクラスを実装しました。Laravelのシングルトンクラス5

class SingletonClazz { 

    private static $instance; 

    protected function __construct() { 
     //Do nothing 
    } 

    public static function getInstance() { 
     if (empty(SingletonClazz::$instance)) { 
      SingletonClazz::$instance = new SingletonClazz(); 
      echo 'Created'; 
     } 
     else { 
      echo ', Already created'; 
     } 

     return SingletonClazz::$instance; 
    } 
} 

route.phpファイルが

Route::group(['prefix' => 'singleton'], function() { 
    Route::get('/', [ 
     'uses' => '[email protected]' 
    ]); 
}); 

私はURL http://localhost:8080/singleton/initSingletonを起動すると結果は以下のように構成され

class MyController extends Controller { 

    public function initSingleton() { 
     SingletonClazz::getInstance(); 
     SingletonClazz::getInstance(); 
     SingletonClazz::getInstance(); 
    } 
} 

以下のように私はクラスのオブジェクトを作成しています'作成済み、既に作成済み、既に作成済み''既に作成済み、既に作成済み、既に作成済み'

この実装に関する問題については、ガイドできますか?

+5

このスクリプトを長期間使用する(デーモンのような)プロセスで使用する場合を除き、アプリケーションに対する各要求は完全に別個のものになります。これはHTTPの設計方法であるためです。シングルトンは、Web要求を行うときに_single_要求を介してのみ存続します。 –

答えて

1

各リクエストはPHPサーバに送信されますが、最初からLavarelを初期化するため、空のシートとして処理されます。前のリクエストで定義された変数は、自動的に次のリクエストに保存されません。

これは、このように設計されたHTTPプロトコルの上に構築されたPHPの設計方法です。

何ができると、セッションにオブジェクトを格納します

<?php 
    session_start(); 

    if(isset($_SESSION['instance'])){ 
    $singleton = $_SESSION['instance']; 
    } else { 
    $singleton = SingletonClazz::getInstance(); 
    $_SESSION['instance'] = SingletonClazz::$instance; 
    } 

?> 

しかし、その後、再びは、あなたがそれを望む理由ともしそうなら、私本当には、あなたの実装を変更することをお勧めします。 シングルトンは構造コードで、同様のインターフェイスを持つ複数のクラスがあり、無駄なデータをセッションに格納しないでください。

+0

詳細をお知らせいただきありがとうございます。私はそれを実装する他のエレガントな方法を探します。他の人が示唆しているLaravel Service Containerかもしれません。 – Sahil

1

なぜシングルトンを実装するのにLaravel IoCを使用しなかったのですか?
コメントのJeff Lambertはまったく正しいです。

+0

詳細をお知らせいただきありがとうございます。私はLaravel Service Containerを見ます – Sahil