10分ぐらいで学べるSymfony2 〜app/config/config.ymlに自分の設定追加編〜
app/config/config.ymlに自分のバンドル設定を追加した際のメモ
Taka512\GooglePlaceBundleみたいなバンドルを制作しましたが
google placeはアクセスするのにapi keyが必要なため、app/configに
自分のバンドルの設定項目が欲しくなり追加してみました。
$ vi app/config/config.yml taka512_google_place: api_key: 'xxxxxxxxxx' $ php app/console cache:clear --env=prod [Symfony\Component\Config\Definition\Exception\InvalidConfigurationException] Unrecognized options "api_key" under "taka512_google_place"
しかし、未定義項目としてエラーとなります。
調べてみると下記の「processConfiguration」あたりでエラーとなってます
$ vi Taka512/GooglePlaceBundle/DependencyInjection/Taka512GooglePlaceExtension.php class Taka512GooglePlaceExtension extends Extension { /** * {@inheritDoc} */ public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs);
これは下のように「api_key」の設定を入れることで回避
$ vi Taka512/GooglePlaceBundle/DependencyInjection/Configuration.php class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('taka512_google_place'); $rootNode ->children() ->scalarNode('api_key')->isRequired()->cannotBeEmpty()->end();
でもって、サービスにパラメータを追加してみたところまたエラー
$ vi Taka512/GooglePlaceBundle/Resources/config/services.yml services: taka512_google_place.search_api: class: %taka512_google_place.search_api.class% arguments: [%taka512_google_place.api_key%] $ php app/console cache:clear --env=prod [Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException] The service "taka512_google_place.search_api" has a dependency on a non-existent parameter "taka512_google_place.api_key".
グローバルなパラメータ値が読み込めてない??と思いつつ調べてみると
Extensionで明示的な設定が必要みたいなので修正
$ vi Taka512/GooglePlaceBundle/DependencyInjection/Taka512GooglePlaceExtension.php class Taka512GooglePlaceExtension extends Extension { public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); foreach (array('api_key') as $attribute) { $container->setParameter('taka512_google_place.'.$attribute, $config[$attribute]); }
これでサービスクラスに無事api_keyがわたるようになりました。
参考
http://symfony.com/doc/current/cookbook/bundles/extension.html