首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将部分动态添加到Symfony 2配置?

如何将部分动态添加到Symfony 2配置?
EN

Stack Overflow用户
提问于 2013-02-02 01:34:22
回答 2查看 1.8K关注 0票数 15
代码语言:javascript
复制
my_bundle:
    algorithm: blowfish # One of 'md5', 'blowfish', 'sha256', 'sha512'

此配置由以下配置树完成:

代码语言:javascript
复制
// 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?)然后调用以下内容:

代码语言:javascript
复制
$rootNode->append($this->getBlowfishParamsNode());
$rootNode->append($this->getSha256ParamsNode());
$rootNode->append($this->getSha512ParamsNode());

编辑:我想要完成的可能配置:

代码语言:javascript
复制
my_bundle:
    algorithm: blowfish
    cost: 15

另一个:

代码语言:javascript
复制
my_bundle:
    algorithm: sha512
    rounds: 50000

另一个是:

代码语言:javascript
复制
my_bundle:
    algorithm: md5
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-06 23:41:21

您可以检查(使用ifTrue()) algorithm的值是否为md5。如果是这种情况,则在包含原始配置值的数组中取消设置blowfishsha256sha513键。

如果algorithmblowfishsha256sha513,则可以使用类似的逻辑。

代码语言:javascript
复制
$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();

你必须使用类似这样的东西:

代码语言:javascript
复制
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

正如您所提到的,您可以将它们全部追加:

代码语言:javascript
复制
$rootNode->append($this->getMd5ParamsNode());
$rootNode->append($this->getBlowfishParamsNode());
$rootNode->append($this->getSha256ParamsNode());
$rootNode->append($this->getSha512ParamsNode());

编辑

还有一个thenUnset()函数。

编辑

Doctrine的way of doing it可能会在这里引起人们的兴趣。

票数 3
EN

Stack Overflow用户

发布于 2013-02-08 07:21:03

Gremo,也许我在这里走错了路。顺便说一句,谢谢你对我的问题的回复。

这只是一种观点,也许这只是一个愚蠢的答案。好了,我们开始吧。

对于你的回答,我知道你已经知道/理解了bundle extension是如何工作的。

也许您可以像在configuring-services-and-setting-parameters上看到的那样定义所需的4个空参数

...您将根据传入的配置值在扩展类中设置此参数...

然后,您可以对树进行特定的检查(例如,如果算法是'blowfish‘,则需要成本)

代码语言:javascript
复制
$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()
;

检查"Appending Sections

代码语言:javascript
复制
public function addBlowfishParametersNode()
{
    $builder = new TreeBuilder();
    $node = $builder->root('parameters');

    $node
        ->isRequired()
        ->requiresAtLeastOneElement()
        ...
        ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14651871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档