2011-12-18 3 views
2

私は小規模なフレームワークを構築しています。これは、将来の小規模なプロジェクトで繰り返される世俗的なものに使用できます。コントローラ内のライブラリにアクセスする方法は?

コントローラ内からライブラリにアクセスするには、最良の方法に固執しています。私はもともとCodeIgniterに似たシステムを実装していました。私のメインコントローラクラスは基本的にスーパーオブジェクトであり、すべてのクラスをクラス変数にロードします。 。だから私は各コントローラメソッドで使用ごとに各クラスを個別にロードすることを考えました。

これを行うにはどのような方法が最適ですか。

答えて

2

各クラスのインスタンスを1つしか持てないようにするには、単純なサービスコンテナを作成します。

class ServiceContainer 
{ 
    protected $services; 

    public function get($className) 
    { 
     if (!array_key_exists($className, $this->services)) { 
      $this->services[$className] = new $className; 
     } 

     return $this->services[$className] 
    } 
} 

次に、アプリケーションごとに1つのServiceContainerインスタンスを作成します。必要に応じて自動ロードと使いやすさのためのファイルパスの取り扱い、または追加するための簡単な方法例えば(あなたのコントローラのすべてにコンテナを注入し、

public function someAction() 
{ 
    $this->container->get('Mailer')->send($email_data); 
} 

簡単な例を使用して、明らかに使用可能にするために多くの作業を必要としますサービスを受けることなく、など)。

+0

これは私が行ったことの一種です。しかし構文が長すぎるように見えるので、私はちょうど静的配列を持つ手続き関数を使いました。 – CrazeD

2

私はCodeIgniterのやり方が好きではありません。それは私には一度も見えませんでした。私は、自動読み込みクラスがspl_autoloadスタックにプッシュされることを好みます。そして、普通などのクラスを呼び出す:

$class = new SomeClass();

+0

しかし、クラスを別の場所で同時に使用する必要があり、それを2回インスタンス化したくない場合はどうすればよいですか?私はすべてのライブラリをシングルトンにする必要がありますか?あるいは、オブジェクトに静的配列を割り当てたクラスをロードし、オブジェクトがすでにロードされていればそれを返す関数を作成する必要がありますか(CodeIgniterのアプローチ)? – CrazeD

+1

@CrazeDシングルトンを実装するのに間違いはありません。 – kba

2

PHPはSPLspl_autoload(および関連する関数)で自動ロード機能を提供します。ライブラリコードにカスタムオートローダを登録することができます。

アプリケーションで処理される共有機能については、Front Controller design patternを考慮しましたか?

関連する問題