22

基本的に、連想配列を定義するノードの下の構成で、任意の(ただしではない)キーと値のペアを許可したいと思います。billings

私はこれを私のConfigurator.php(の一部)に持っています:

->arrayNode('billings')
    ->isRequired()
    ->requiresAtLeastOneElement()
    ->prototype('scalar')
    ->end()
->end()

そして、私の中でconfig.yml

my_bundle:
    billings:
        monthly : Monthly
        bimonthly : Bimonthly

ただし、出力$config

class MyBundleExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new Loader\YamlFileLoader($container,
            new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');

        $processor     = new Processor();
        $configuration = new Configuration();

        $config = $processor->processConfiguration($configuration, $configs);

        $container->setParameter('my_bundle.billings', $config['billings']);

        var_dump($config);
        die();
    }

}

...私が得るのは、連想的なものではなく、数値による配列インデックスです:

 'billings' => 
     array (size=2)
         0 => string 'Monthly' (length=7)
         1 => string 'Bimonthly' (length=9)

好奇心から(そしてこれが役立つ場合)、この配列をサービスパラメーターとして挿入しようとしています(この素晴らしいバンドルからの注釈:JMSDiExtraBundle):

class BillingType extends \Symfony\Component\Form\AbstractType
{

    /**
     * @var array
     */
    private $billingChoices;

    /**
     * @InjectParams({"billingChoices" = @Inject("%billings%")})
     *
     * @param array $billingChoices
     */
    public function __construct(array $billingChoices)
    {
        $this->billingChoices = $billingChoices;
    }
} 
4

4 に答える 4

24

useAttributeAsKey('name')の課金ノード構成に追加する必要がありますConfigurator.php

Symfony API ドキュメンテーションuseAttributeAsKey()で読むことができるあなたについての詳細情報

課金ノードの構成を変更すると、次のようになります。

->arrayNode('billings')
    ->isRequired()
    ->requiresAtLeastOneElement()
    ->useAttributeAsKey('name')
    ->prototype('scalar')->end()
->end()
于 2012-06-07T06:20:46.303 に答える
2

最近、ネストされたアレイ構成をセットアップする必要がありました。

ニーズは

  • カスタム キーを持つ第 1 レベルの配列 (エンティティ パスを記述する)
  • これらの配列のそれぞれは、ブール値を持つ 1 つ以上の任意のタグをキーとして持つ必要がありました。

このような構成を実現するには、casacadeprototype()メソッドを使用する必要があります。

したがって、次の構成:

my_bundle:
    some_scalar: my_scalar_value
    first_level:
        "AppBundle:User":
            first_tag: false
        "AppBundle:Admin":
            second_tag: true
            third_tag: false

次の構成を使用して取得できます。

$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('my_bundle');
$rootNode
    ->addDefaultsIfNotSet() # may or may not apply to your needs
    ->performNoDeepMerging() # may or may not apply to your needs
    ->children()
        ->scalarNode('some_scalar')
            ->info("Some useful tips ..")
            ->defaultValue('default')
            ->end()
        ->arrayNode('first_level')
            ->info('Useful tips here..')
            # first_level expects its children to be arrays
            # with arbitrary key names
            ->prototype('array')
                # Those arrays are expected to hold one or more boolean entr(y|ies)
                # with arbitrary key names
                ->prototype('boolean')
                    ->defaultFalse()->end()
                ->end()
            ->end()
        ->end()
    ->end();
return $treeBuilder;

拡張クラス内から $config をダンプすると、次の出力が得られます。

Array
(
    [some_scalar] => my_scalar_value
    [first_level] => Array
        (
            [AppBundle:User] => Array
                (
                    [first_tag] => 
                )

            [AppBundle:Admin] => Array
                (
                    [second_tag] => 1
                    [third_tag] => 
                )
        )
)

そしてほら!

于 2016-05-10T14:02:22.337 に答える
2

次のようなものを追加できます。

->arrayNode('billings')
    ->useAttributeAsKey('whatever')
    ->prototype('scalar')->end()

その後、鍵が魔法のように現れます。

参照: https://github.com/symfony/symfony/issues/12304

于 2014-10-23T16:45:36.097 に答える