Symfony选项解析器允许无效选项

时间:2014-10-19 00:10:55

标签: symfony configuration components

我正在使用silex项目中的optionsResolver组件来解析配置选项。如果我没有使用setRequiredsetOptionalsetDefaults明确设置选项,则会收到错误Fatal error: Uncaught exception 'Symfony\Component\OptionsResolver\Exception\InvalidOptionsException' with message 'The option "option.key" does not exist. Known options are: ...

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

有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

我在ApiGen中使用此组件,我认为您无法添加未指定的选项。

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

您的具体用例是什么?

答案 1 :(得分: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);

答案 2 :(得分:0)

我认为这种解决方案会更漂亮,更简单。 只需创建自己的optionsResolver即可扩展symfony基数并覆盖'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);
    }
}