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