2009-07-12 4 views
1

構成に数百行のXMLファイルを使用するかなり大規模なMVC PHP Webアプリケーション(カスタム、フレームワークなし)があります。設定データは非常に複雑な構造をしていますが、これはXMLで非常にエレガントに表現されていますが、DOMを使用して簡単に読み書きすることはできません。設定データの読み書きはすべてConfigクラスを経由します。このクラスには、各タイプの設定データ用のアクセサメソッドがあります。各XMLノードは異なるため、ほとんどのメソッドで独自のカスタムコードが使用されます。このクラスは現在、約2000行の長さで、私はそれが気に入らない。データベースは利用できません。複雑な設定をファイルに保存する(PHP)

設定データを永続化するより良い方法は、いくつかの設定クラスを作成し、ファイルにオブジェクト直列化を使用することです。

複雑な設定データを処理するためのベストプラクティスは何ですか?

答えて

1

私はそれほどファンではありませんが、XML設定の面白さの1つは、理論的には手作業で編集できることです。任意の複雑さの直列化されたPHPオブジェクトで、それを手で編集可能と呼ぶことは本当のストレッチです。 16進エディタを使用してバイナリ実行可能ファイル内の文字列を変更するよりも、難易度が低く、エラーが発生しにくいです。

インターフェイスの外で設定ファイルを編集したい場合は、PHPオブジェクトのシリアライズを行うことはできません。それについて気にしなければ、おそらくうまくいくでしょう。

あなたのXMLノードのカスタムコードが大幅に分解されて一般化される可能性が強く疑われます。

2

SQLiteを考慮しましたか?

本質的にファイルである軽量スタンドアロンデータベースです。データベースは、ローカルまたはリモートで使用できます。設定をファイルに保存することができれば、SQLiteデータベースに永続化することもできるはずです。

シリアル化の別のオプションとしてJSONを使用することもできます。これは理論的には依然として人間が読める形式であり、最終的な表現のように「オブジェクト」が増え、アクセスコードが少し単純になるという利点があります。もう1つの利点は、処理のためにモデルの全部または一部をクライアント側に保持できるということです。しかし、あなたはあなたが望むかもしれないし、そうでないかもしれないあなたのアプリにいくつかのjavascriptを導入する必要があります。

0

構成構造のレイアウトが気に入ったら、構成ハンドラの既存のコードベースをリファクタリングするほうがよいでしょう。私はあなたがシリアライゼーションから多くの利益を得ようとしているのかどうかはわかりません。もしあれば、構造が変わった場合にデバッグするのがやや難しいと思う。

2

INIファイルには、サンプルの設定を見て、私はZend Frameworkの中にストア構成に使用する方法である:

設定を読み込み

http://www.framework.zend.com/manual/en/zend.config.adapters.ini.html

; Production site configuration data 
[production] 
webhost     = www.example.com 
database.adapter   = pdo_mysql 
database.params.host  = db.example.com 
database.params.username = dbuser 
database.params.password = secret 
database.params.dbname = dbname 

; Staging site configuration data inherits from production and 
; overrides values as necessary 
[staging : production] 
database.params.host  = dev.example.com 
database.params.username = devuser 
database.params.password = devsecret 

:コンフィギュレーションを書く

$config = new Zend_Config_Ini('/path/to/config.ini', 'staging'); 

echo $config->database->params->host; // prints "dev.example.com" 
echo $config->database->params->dbname; // prints "dbname" 

// Load all sections from an existing config file, while skipping the extends. 
$config = new Zend_Config_Ini('config.ini', 
           null, 
           array('skipExtends'  => true, 
            'allowModifications' => true)); 

// Modify a value 
$config->production->hostname = 'foobar'; 

// Write the config file 
$writer = new Zend_Config_Writer_Ini(array('config' => $config, 
              'filename' => 'config.ini')); 
$writer->write(); 

構成の各ノードはアレイに変換することができますが、複雑な配列を使用して構成クラスのインスタンスを作成し、ファイルに保存することもできます。

このタイプの設定は、人間が読める形式で編集可能です。

多分、同様の解決策を作成するようにしてください。

関連する問題