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();
由于每个算法需要不同的参数,我如何根据所选的算法将它们动态添加为根节点的子节点?
例如,如果algorithm是"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
发布于 2013-02-06 23:41:21
您可以检查(使用ifTrue()
) algorithm
的值是否为md5
。如果是这种情况,则在包含原始配置值的数组中取消设置blowfish
、sha256
和sha513
键。
如果algorithm
为blowfish
、sha256
或sha513
,则可以使用类似的逻辑。
$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的way of doing it可能会在这里引起人们的兴趣。
发布于 2013-02-08 07:21:03
Gremo,也许我在这里走错了路。顺便说一句,谢谢你对我的问题的回复。
这只是一种观点,也许这只是一个愚蠢的答案。好了,我们开始吧。
对于你的回答,我知道你已经知道/理解了bundle extension是如何工作的。
也许您可以像在configuring-services-and-setting-parameters上看到的那样定义所需的4个空参数
...您将根据传入的配置值在扩展类中设置此参数...
然后,您可以对树进行特定的检查(例如,如果算法是'blowfish‘,则需要成本)
$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()
...
...
https://stackoverflow.com/questions/14651871
复制相似问题