読者です 読者をやめる 読者になる 読者になる

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