Symfony Configコンポーネントのアーキテクチャについて簡単に説明します





Symfony 2 Configコンポーネントは、構成ファイルを操作するように設計されており、次の機能を提供します。





このコンポーネントの公式ドキュメントには、その使用に関する詳細情報が含まれています。 そして、このコンポーネントがどのように配置されているかを見てみましょう。



構成構造の定義



構成キーの種類



これは、構成図を説明するクラス図のようです。







ほとんどすべてのクラスの目的は、名前から明らかです。 ArrayNode



ノードが構成ツリーの構築に使用されることに注意してください。 ArrayNode



に事前定義されたノードだけでなく、他のいくつかのArrayNode



ArrayNode



が、事前定義された内部構造がまったく同じである場合、 PrototypedArrayNode



を使用できます。



設定の説明を作成するために、 Symfony\Component\Config\Definition\Builder\TreeBuilder



おおよそ次の方法でSymfony\Component\Config\Definition\Builder\TreeBuilder



ます:



 <?php use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('acme_demo'); $rootNode ->children() ->arrayNode('entities') ->addDefaultsIfNotSet() ->prototype('scalar')->end() ->defaultValue( array( 'Acme\BaseBundle\Entity\DefaultEntity1', 'Acme\BaseBundle\Entity\DefaultEntity2', ) ) ->end(); return $rootNode; } }
      
      





構成構造をすべて1か所で宣言する必要はありません。 これをパーツでNodeBuilder



NodeBuilder



append



メソッドを使用してパーツを結合できNodeBuilder







正規化



正規化とは、ノードキー名とその値を、必要に応じて標準形式に縮小することです。 実際、XMLで記述されたノードを



 <children> <child> </child> </children>
      
      





気にする

  "children" => Array( [0] => " " )
      
      





ノードを正規化するには、 normalize()



メソッドがSymfony\Component\Config\Definition\NodeInterface



ます。 また、 Symfony\Component\Config\Definition\BaseNode



preNormalize



メソッドがあります。 後者は、 foo_bar



およびfoo-bar



キーをfoo_bar



するために使用されます。



ファイナライズ



ノードの最終化プロセスでは、構成内の読み取りのためにノードを準備し、宣言されたタイプとそのルールへの準拠を確認するための手順を実行します。 finalizeValue



は、 BaseNode



子孫のfinalizeValue



メソッドによって実行されます



NodeDefinition



の事前定義されたメソッドとNodeDefinition



などの子孫を使用してデータ検証を実行し、 Symfony\Component\Config\Definition\Builder\ValidationBuilder



クラスに委任された高度な検証を使用します。



複数の部分からのデータを結合するためのルールは、 Symfony\Component\Config\Definition\Builder\MergeBuilder



ます。 チェックの委任は、 NodeDefinition



クラスのmerge()メソッドによって実行されます。 たとえば、選択した構成キーの値が初めて読み取られた後、他の構成ファイルによって再定義されないようにすることができます。



設定の検証/正規化/最終化のプロセスは次のようになります。



 $configs = array($config1, $config2); //     $processor = new Processor(); //   $configuration = new Configuration(); //  Configuration c   (. ). $processedConfiguration = $processor->processConfiguration( $configuration, $configs );
      
      





ビルダー



ご覧のとおり、 TreeBuilder



Symfony\Component\Config\Definition\Builder\NodeBuilder



クラスのインスタンスを使用して、構成記述Symfony\Component\Config\Definition\Builder\NodeBuilder



を構築します。 したがって、構成するノードのタイプを適切に決定できます。 これを行うには、独自のバージョンのNodeInterface



とその子孫\Symfony\Component\Config\Definition\Builder\NodeDefinition



ます。 次に、 NodeBuilder



setNodeClass



メソッドsetNodeClass



呼び出しNodeBuilder







設定構造を決定するプロセスはここで詳細に説明されます



ダンパー



設定構造が構築された後、 Symfony\Component\Config\Definition\Dumper



名前空間のさまざまなダンパーを使用してダンプできます。 現在、 YamlReferenceDumper



XmlReferenceDumper



2つのオプションがあります。 これらのダンパーは、たとえばコンソール./bin/symfony config:dump-reference



から呼び出すときに使用され./bin/symfony config:dump-reference



Symfony\Bundle\FrameworkBundle\Command\ConfigDumpReferenceCommand







設定をダウンロード



リソースとダウンローダー





Configコンポーネント自体には特定のブートローダー実装が含まれていないと言わなければなりません。 実装に必要なインターフェースのみを提供します。 さらに、ダウンロードされたデータのロード方法とターゲットコンテナも規制されていません。 Symfony\Component\DependencyInjection\Loader\YamlFileLoader



の実装を見ると、設定がコンテナに直接ロードされていることがわかります。



構成のキャッシュ



Symfony Configでは、 Symfony\Component\Config\ConfigCache



を使用して、ロードされた構成をキャッシュできます:



 <?php use Symfony\Component\Config\ConfigCache; use Symfony\Component\Config\Resource\FileResource; $cachePath = __DIR__.'/cache/appSomeCacheFile.php'; //   ,      ,     $cacheFile = new ConfigCache($cachePath, true); if (!$cacheFile->isFresh()) { $configFiles = []; //   ,     $resources = array(); foreach ($configFiles as $cfgFile) { //    // ..... //      $resources[] = new FileResource($cfgFile); } $code = '...'; //      // .             $cacheFile->write($code, $resources); } //    require $cachePath;
      
      





たとえば、クラスでキャッシュ再構築アルゴリズムをカプセル化し、その後の作業のためにSymfony\Component\Config\ConfigCacheFactory



代わりにSymfony\Component\Config\ConfigCacheFactory



使用できます。 ConfigCacheFactory



はコンストラクターでConfigCacheFactory



を受け入れ、キャッシュを再構築します。



コンポーネントの使用例



Symfony Configコンポーネントは、フレームワークなしでも使用できます。 例として、評判の良いmagickattによって書かれた小さなコードを以下に示します。



 <?php //      try { $basepath = __DIR__ . '/config'; $configuration = Yaml::parse($basepath . '/config.yml'); } catch (\InvalidArgumentException $exception) { exit(",   "); } //  ConfigurationInterface    *.yml  $yamlConfiguration = new \Configuration(); //    (     *.yml) $processor = new Processor(); $configuration = $processor->processConfiguration( $yamlConfiguration, array($configuration) //      *.yml  ); use Symfony\Component\Config\Definition\ConfigurationInterface; use Symfony\Component\Config\Definition\Builder\TreeBuilder; class Configuration { /** * @return TreeBuilder */ public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('arbitary'); $rootNode->children() ->scalarNode('host') ->isRequired() ->cannotBeEmpty() ->end() ->scalarNode('username') ->isRequired() ->cannotBeEmpty() ->end() ->scalarNode('password') ->isRequired() ->cannotBeEmpty() ->end() ->booleanNode('bindRequiresDn') ->defaultTrue() ->end(); return $treeBuilder; } }
      
      






All Articles