2014-10-19 30 views
1

我正在使用一个silex项目中的optionsResolver组件来解析配置选项。如果我不明确设置选项与setRequiredsetOptional,或setDefaults我得到一个错误Fatal error: Uncaught exception 'Symfony\Component\OptionsResolver\Exception\InvalidOptionsException' with message 'The option "option.key" does not exist. Known options are: ...Symfony选项解析器允许无效的选项

我想允许不与这些方法定义的选项。我尝试使用自己的类来扩展类,但是类使用了很多私有方法,这些方法会要求我复制/粘贴大部分类。

有没有更好的方法来做到这一点?

回答

0

我在ApiGen中使用这个组件我认为你不能添加未指定的选项。

如果您知道所有选项,最好将它们全部命名。

你的具体用例是什么?

+0

我正在构建一个silex骨架。我使用它来要求/验证一些配置选项,但我需要添加未指定的其他选项。 – Yamiko 2014-11-06 22:58:15

+0

在这种情况下,我只能将OptionsResolver用于已知的配置选项。 这样的事情(未测试): '''php $ config = array('known'=> TRUE,'unknown'=> FALSE); $ knonwKeys = array('knonw'); $ knonwOptions = array_filter($ config,function($ key){return in_array($ key,$ knownKeys); ARRAY_FILTER_USE_KEY); $ optionsResolver-> resolve($ knonwOptions); ''' (可能不会在评论中写出漂亮的代码)。 – 2014-11-07 16:10:34

0

我通过创建两个解析器解决了这个问题。一个是固定选项列表,另一个是我动态添加选项的地方。然后我使用array_filter将传入选项数组分割为两个数组:

$dynamicOptions = array_filter($options, function($k) use ($fixedOptionKeys) { 
    if (!in_array($k, $fixedOptionKeys)) { 
     return true; 
    } 
}, ARRAY_FILTER_USE_KEY); 

$fixedOptions = array_filter($options, function($k) use ($fixedOptionKeys) { 
    if (in_array($k, $fixedOptionKeys)) { 
     return true; 
    } 
}, ARRAY_FILTER_USE_KEY);