gpt4 book ai didi

php - 使用 OptionsResolver 组件进行高级类型验证

转载 作者:可可西里 更新时间:2023-11-01 13:49:16 26 4
gpt4 key购买 nike

我需要允许实现两个接口(interface)(FooBar)的类型,而不是其中之一。

interface Foo {};
interface Bar {};

class Foz implements Foo {};
class Baz implements Bar {};
class Foobar implements Foo, Bar {};

$resolver = new OptionsResolver();
$resolver->setRequired('data');
$resolver->setAllowedTypes('data', ['Foo', 'Bar']);

错误! 也允许 FozBaz 实例。


我需要允许 Bar 的类型子类,而不是 Bar 实例。

class Bar {};
class Foobar extends Bar {};
class FoobarBaz extends Foobar {};

$resolver = new OptionsResolver();
$resolver->setRequired('data');
$resolver->setAllowedTypes('data', ['Bar']);

错误! 也允许 Bar 实例。


我可以重新设计我的类/接口(interface),但这不是设计问题。 那么,是否可以通过这个组件来实现呢?

最佳答案

参见 Define a form option allowed values depending on another option value in a FormType .

您应该为此使用标准化器:

use Symfony\Component\Form\Exception\InvalidConfigurationException;

$resolver->setNormalizer('data', function(Options $options, $data) {
if (!$data instanceof Foo && !$data instanceof Bar) {
throw new InvalidConfigurationException('"data" option must implement "Foo" and "Bar" interfaces.');
}

return $data;
});

关于php - 使用 OptionsResolver 组件进行高级类型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39751569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com