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