5

1 つではなく、 2 つのインターフェイス (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']);

違う!インスタンスも許可Fozします。Baz


インスタンスでBarはなく、タイプのサブクラスを許可する必要があります。Bar

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

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

違う!Barインスタンスも許可します。


クラス/インターフェースを再設計できますが、設計上の問題ではありません。それで、このコンポーネントでそれを達成することは可能ですか?

4

3 に答える 3

5

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;
});
于 2016-09-28T19:44:33.913 に答える
2

最後に、方法を見つけましたが、それが従来の方法であるかどうかはまったくわかりません。

//...
function is_foobar($value) {
    //return true or false;
}

$resolver = new OptionsResolver();
$resolver->setRequired('data');
$resolver->setAllowedTypes('data', 'foobar');
//...

編集:

setAllowedValuesまあ、私が寝た後、またはaddAllowedValuesメソッドを使用してすでに行われているため、私のアプローチは間違っていると思います:

$resolver->setAllowedValues('foo', function ($value) {
    return $value instanceof Foo && $value instanceof Bar;
});

setAllowedTypesしたがって、この目的で使用する必要はありません。

于 2016-09-28T15:58:56.277 に答える