私は MVC PHP フレームワークを構築していますが、クラスに必要なものをロードするためのベスト プラクティスはどれでしょうか (他のクラスであろうと単純な構成であろうと)。
今日まで、私はシングルトン、レジストリ、そして最近では依存性注入コンテナーを使用してきました。多くの人が DI が進むべき道だと主張していますが、DI はコンポーネント間の結合の問題を別の場所に移しているように思えます。
シングルトンはグローバル状態を導入し、レジストリは密結合を導入し、DI は複雑さを導入します。私はまだ混乱しており、クラスを相互に配線する適切な方法を見つけることができません。
その間、私はカスタムソリューションを思いつきました。実際には解決策ではなく、コードからサービスのロードの実装を抽象化するだけです。
フレームワークのすべてのコンポーネントが他のサービスまたは構成をロードするために拡張する _load_service および _load_config メソッドを使用して抽象クラスを構築しました。
abstract class Base_Component {
function _load_service($service) {
// could be either
return DI_container::getInstance()->$service;
// or
$class = '\services\\'.$service;
return new $class;
// or other implementation
}
}
それらをロードする実装は、基本クラスの 1 つの場所だけに実装されるようになったため、少なくとも次のようなコード行をコンポーネントから削除しました。
$database = new Database(Registry::getInstance()->load('db_config'));
また
$database = DI_container::getInstance()->database;
データベースインスタンスが必要な場合は、これを行います
$database = $this->_load_service('database');
また、サービス ローダー、コンテナ、レジストリなどの実装は、以前使用していたコンテナ実装への呼び出しを変更するためにすべてのコードを検索することなく、単一のクラス メソッドで簡単に変更できます。
しかし、私が言ったように、クラスと構成をロードするためにどの方法を使用するかについては、よくわかりません。
あなたの意見は何ですか?