我正在使用silex项目中的optionsResolver组件来解析配置选项。如果我没有使用setRequired
,setOptional
或setDefaults
明确设置选项,则会收到错误Fatal error: Uncaught exception 'Symfony\Component\OptionsResolver\Exception\InvalidOptionsException' with message 'The option "option.key" does not exist. Known options are: ...
我想允许那些没有用这些方法定义的选项。我试图使用我自己的类来扩展类,但是类使用了许多私有方法,这些方法需要我复制/粘贴大部分类。
有更好的方法吗?
答案 0 :(得分:0)
答案 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);
}
}