15
my_bundle:
    algorithm: blowfish # One of 'md5', 'blowfish', 'sha256', 'sha512'

この構成は、次の構成ツリーによって行われます。

// Algorithms and constants to check
$algorithms = array(
    'md5'      => 'CRYPT_MD5',
    'blowfish' => 'CRYPT_BLOWFISH',
    'sha256'   => 'CRYPT_SHA256',
    'sha512'   => 'CRYPT_SHA512',
);

$rootNode
    ->children()
        ->scalarNode('algorithm')
            ->isRequired()
            ->beforeNormalization()
                ->ifString()
                ->then(function($v) { return strtolower($v); })
            ->end()
            ->validate()
                ->ifNotInArray(array_keys($algorithms))
                ->thenInvalid('invalid algorithm.')
            ->end()
            ->validate()
                ->ifTrue(function($v) use($algorithms) {
                    return 1 != @constant($algorithms[$v]);
                })
                ->thenInvalid('algorithm %s is not supported by this system.')
            ->end()
        ->end()
    ->end();

各アルゴリズムには異なるパラメーターが必要なため、選択したアルゴリズムに基づいて、ルート ノードの子としてそれらを動的に追加するにはどうすればよいですか?

たとえば、アルゴリズムが「blowfish」の場合、「cost」という名前のスカラー ノードが存在する必要がありますが、「sha512」の場合、スカラー ノードは「丸められ」、それぞれ異なる検証ルールが適用されます。

編集:私が本当に必要としているのは、現在のアルゴリズムを理解することです(どうすればいい$rootNodeですか?)。

$rootNode->append($this->getBlowfishParamsNode());
$rootNode->append($this->getSha256ParamsNode());
$rootNode->append($this->getSha512ParamsNode());

編集:私が達成したい可能な構成:

my_bundle:
    algorithm: blowfish
    cost: 15

別:

my_bundle:
    algorithm: sha512
    rounds: 50000

そしてもう一つ:

my_bundle:
    algorithm: md5
4

2 に答える 2

3

ifTrue()の値が でalgorithmあるかどうかを( を使用して)確認できmd5ます。この場合、未加工の構成値を含む配列内のblowfish, sha256,キーの設定を解除します。sha513

が、またはの場合algorithmは、同様のロジックを使用できます。blowfishsha256sha513


$rootNode->
    ->beforeNormalization()
        //...
        ->ifTrue(function($v) {
            // $v contains the raw configuration values
            return 'md5' === $v['algorithm'];
        })
        ->then(function($v) {
            unset($v['blowfish']);
            unset($v['sha256']);
            unset($v['sha512']);
            return $v;
        })
        ->end()
        // ...do same logic for the others
    ->end();

次のようなものを使用する必要があります。

my_bundle:
    algorithm: blowfish
    md5: #your params
    blowfish: #will be unset if algorithm is md5 for example
    sha256: #will be unset if algorithm is md5 for example
    sha512: #will be unset if algorithm is md5 for example

あなたが言及したように、それらすべてを追加できます:

$rootNode->append($this->getMd5ParamsNode());
$rootNode->append($this->getBlowfishParamsNode());
$rootNode->append($this->getSha256ParamsNode());
$rootNode->append($this->getSha512ParamsNode());

編集

機能もありthenUnset()ます。

編集

Doctrine のやり方は、ここで興味深いかもしれません。

于 2013-02-06T15:41:20.967 に答える
0

グレモ、多分ここで間違った道を進んでいる。ところで、私の質問に対するあなたの返事に感謝します。

それはただの意見かもしれませんが、それはばかげた答えかもしれません...さて、ここに行きます。

あなたの答えのために、私はあなたがバンドル拡張がどのように機能するかをすでに知っている/理解していることを知っています。

たぶん、 configuration-services-and-setting-parametersに見られるように、必要な4つの空のパラメーターを定義できます。

...着信構成値に基づいて、拡張クラスでこのパラメーターを設定します...

次に、ツリーで特定のチェックを行うことができます(たとえば、アルゴリズムが「フグ」の場合、コストが必要です)

$rootNode->
    ->beforeNormalization()
        ->ifTrue(function($v) {
            // $v contains the raw configuration values
            // if 'algorithm' blowfish -> cost isRequired
            // or as you said on your question you can call
            // ->append($this->addBlowfishParametersNode())
        })
        ->then(function($v) {
            // maybe some unsetting, but not needed
        })
        ->end()
    ->children()
        // ...
    ->end()
;

「追加セクション」をチェックしてください

public function addBlowfishParametersNode()
{
    $builder = new TreeBuilder();
    $node = $builder->root('parameters');

    $node
        ->isRequired()
        ->requiresAtLeastOneElement()
        ...
        ...
于 2013-02-07T23:21:03.473 に答える