構成ファイルをロードして解析するクラスがあるとします。ただし、その構成ファイルには次の 3 つのタイプがあります。
- JSON
- YAML
- INI
物事を維持するために「configLoader」を設計するにはどうすればよいですか:
- 疎結合
- 単体テストがしやすい
- コンポーネントの切り替えが容易 (たとえば、古いパーサーを新しい優れたパーサーに変更)
しかし同時に:
- 簡単に拡張できます (つまり、たとえば、XML のような受け入れられる新しいタイプのファイルを追加することを意味します)。
- クラスが機能するための大規模なコンストラクターまたはセッターなし
いくつかのメモ
- すべてのパーサーは同じインターフェース (ParserInterface) を実装します
- たとえば、Symfony/Yaml などのよく知られたパーサーのラッパー (アダプター) として機能できます。
- このクラスは、DI コンテナーの初期化の前に初期化されるため (ロジックに沿って、ここにロードされた値は実際に DI コンテナーに注入されます)、ここで使用することはできません。
コード
これが私がこれまでに持っているものです:
class Loader
{
/**
* Loads a configuration string from a ConfigFile
*
* @param ConfigFile $configFile
* @throws ConfigException if the file type is not recognised
* @return Config ArrayObject with configuration settings
*/
public function loadFromFile(ConfigFile $configFile)
{
// Finds out what type of config file it is
$type = $configFile->getType();
//Loads the file into memory
$configString = $configFile->read();
switch ($type) {
case ConfigFile::TYPE_YAML:
$parser = new YAML\YamlParser(); //Here's the problem
break;
case ConfigFile::TYPE_JSON:
$parser = new JSON\JsonParser(); //Here's the problem
break;
// (...) same for other file types
// Default case if file type is not recognised
default:
throw new ConfigException('Config File type not recognised');
}
return $parser->decode($configString);
}
}