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”是一个标量节点“rounds”,每个节点都有不同的验证规则。
编辑:我真正需要的是弄清楚当前的算法(如何处理$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