2

私の Web アプリケーションでは、最初にデータベース接続アダプターが作成されます。その前に、アプリケーション構成が構築されます。どちらも、ZF2 の適切な Zend コンポーネントを介してインスタンス化されます。私は ZF2 をライブラリとしてのみ使用しており、フレームワーク自体としては使用していないことに注意してください。

基本的に、これは私のアプリケーションの初期化で起こっていることです。

$config   = new \Zend\Config\Config(array());
$database = new \Zend\Db\Adapter\Adapter($config->database->toArray);

/**
*Create the session, start the session
*Set error handling
*/

かっこいいので、それが大部分です。次に、リクエストを処理します。

$router = new \ils\Router($_SERVER['REQUEST_URI'], $database]);
$router->dispatch();

ルーター内では、基本的にURIをコンポーネントに分割し、ルートが有効であることを確認してから、次を使用してディスパッチしています。

$dispatchedController = new $this->controller($this->database);
$method = $this->method;

私は基本的に、初期化からルーターを介してコントローラーに提供したデータベースコンポーネントを注入しています。それはDIに十分近いですか?どうすれば改善できますか?

したがって、コントローラークラス内には、請負業者があります

public function __construct($database){
    $this->database = $database;
}

それはそれです。その後、必要に応じて関連する DAO に渡すことができます。

私の問題は、アプリケーションのいくつかの場所、特にビューやその他のクラスで、サービスを取得していることです-おそらくあなたが考えているタイプではありません! これらのサービスは情報を中継するだけで、通常はオブジェクトとしてインスタンス化されません:

class UserService {

  public static function getUsername(){

   $container = new \Zend\Session\Container('application_session');

   return $sessionContainer->userId;

  } 

そして、次のようなメソッドがあります - これが問題です:

public function getCurrentUser(){

    $user = new \ils\objects\user();
    $user->setUserId(self::currentUserId());

    $data = new \model\dao\users($database);
    $user = $data->loadUser($user);

    return $user;
}

さて、どこ$databaseから行こうか?一部の場所ではクラス サービスをオブジェクトとしてインスタンス化し、それをフィードすることができますが、できない場所がいくつかあります。

Zend を使用ServiceManagerしてそれにフックすることを考えていましたが、どうすれば ServiceManager を取得できますか?

潜在的に、シングルトンを使用して、標準オブジェクト (構成、データベースなど) の一種のグローバル コンテナーを作成できますか?

4

1 に答える 1

-1

以前にこの問題がありましたが、databaseライブラリをビューに渡すことで解決しました! ビューをロードするための単一の呼び出しがあり$data、適切なビューに渡される配列に、データベースと他のライブラリを配置します。

$data = array(
  'DATABASE' => &$this->db,
  'INPUT' => &$this->input
);

過負荷が発生しないように、変数のアドレスを渡そうとします。

于 2012-12-31T22:05:09.667 に答える