Symfony选项解析程序允许无效选项

Symfony选项解析程序允许无效选项,symfony,configuration,components,Symfony,Configuration,Components,我在silex项目中使用optionsResolver组件来解析配置选项。如果我没有使用setRequired、setOptional或setDefaults显式设置选项,我会得到一个错误致命错误:未捕获异常“Symfony\Component\optionresolver\exception\invalidoptionexception”,消息“option.key”不存在。已知选项有:… 我想允许没有用这些方法定义的选项。我尝试使用我自己的类来扩展该类,但该类使用了许多私有方法,这需要我复制

我在silex项目中使用optionsResolver组件来解析配置选项。如果我没有使用
setRequired
setOptional
setDefaults
显式设置选项,我会得到一个错误
致命错误:未捕获异常“Symfony\Component\optionresolver\exception\invalidoptionexception”,消息“option.key”不存在。已知选项有:…

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

有更好的方法吗?

我使用这个组件,我认为您不能添加未指定的选项

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


您的具体用例是什么?

我通过创建两个解析器解决了这个问题。一个是固定选项列表,另一个是动态添加选项的地方。然后,我使用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);

我认为这个解决方案会更漂亮、更简单。 只需创建您自己的optionsResolver,扩展symfony base one并覆盖“resolve”方法

希望能有所帮助

use Symfony\Component\OptionsResolver\OptionsResolver;

class ExtraOptionsResolver extends OptionsResolver
{
    /**
     * Strip options that have been passed to
     * this method to be resolved, and that have not been defined as default or required options
     * The default behaviour is to throw an UndefinedOptionsException
     *
     * @author Seif
     */
    public function resolve(array $options = array())
    {
        // passing by ref in loops is discouraged, we'll make a copy
        $transformedInputOptions = $options;
        foreach ($options as $key => $option) {
            if (!in_array($key, $this->getDefinedOptions())) { // option was not defined
                unset($transformedInputOptions[$key]); // we will eject it from options list
            }
        }

        return parent::resolve($transformedInputOptions);
    }
}

我正在建造一个silex骨架。我使用它来要求/验证一些配置选项,但我需要添加未指定的其他选项。在这种情况下,我只会对已知的配置选项使用OptionsResolver。类似这样的内容(未测试):
php$config=array('known'=>TRUE,'unknown'=>FALSE)$knowkeys=数组('knoww')$knowoptions=array_filter($config,function($key){return in_array($key,$knownKeys);,array_filter_USE_key);$optionsResolver->resolve($knowoptions);
(可能无法在注释中编写好的代码)。