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();
Поскольку для каждого алгоритма требуются разные параметры, как я могу динамически добавлять их в качестве дочерних элементов корня node, основываясь на выбранном алгоритме?
Например, если алгоритм "blowfish", должен быть скаляр node с именем "cost", а если "sha512" - скалярные node "раунды", каждый из которых имеет разные правила проверки.
EDIT: мне действительно нужно выяснить текущий алгоритм (как сделать с $rootNode
?), а не вызвать:
$rootNode->append($this->getBlowfishParamsNode());
$rootNode->append($this->getSha256ParamsNode());
$rootNode->append($this->getSha512ParamsNode());
EDIT: возможные конфигурации, которые я хотел бы выполнить:
my_bundle:
algorithm: blowfish
cost: 15
Другой:
my_bundle:
algorithm: sha512
rounds: 50000
И еще:
my_bundle:
algorithm: md5