habe ich die Situation auf OptionsResolver Component basiert folgt:Wie mit OptionsResolver Component zwei verwandten Optionen zu normalisieren
- Ich habe zwei Möglichkeiten:
bar
undfoo
, sowohlnull
standardmäßig. bar
Option akzeptiertB
Wert auch.foo
Option akzeptiertA
,B
,C
, Werte auch. Jetzt
, wenn diese Optionen aufgelöst werden, wenn foo
Option A
gleich ist, muss bar
Option B
geändert werden, aber ich brauche auch: wenn foo
Option gleich A
oder B
ist dies C
geändert werden muss .
Ich habe versucht, das umzusetzen, aber das erwartete Ergebnis ist falsch:
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
$resolver = new OptionsResolver();
$resolver->setDefaults(array(
'bar' => null,
'foo' => null,
));
$resolver->setAllowedValues('bar', array(null, 'B'));
$resolver->setAllowedValues('foo', array(null, 'A', 'B', 'C', 'D'));
$resolver->setNormalizer('bar', function (Options $options, $value) {
if ('A' === $options['foo']) {
return 'B';
}
return $value;
});
$resolver->setNormalizer('foo', function (Options $options, $value) {
if ('A' === $value || 'B' === $value) {
$value = 'C';
}
return $value;
});
$options = $resolver->resolve(array('foo' => 'A'));
var_dump($options);
dies immer wieder:
array(2) {
["foo"] => string(1) "C"
["bar"] => NULL // wrong normalization, expected `B` value.
}
Das Problem ist, dass 'A' === $options['foo']
Anweisung in bar
normalizer Anrufe zu foo
Normalizer (dh $options->offsetGet('foo')
), um die Bedingung zu vervollständigen, so dass für diesen Test immer überprüft 'A' === 'C'
und bar
Option nicht erfolgreich normalisiert.
Wie funktioniert es?
Der zweite normalizer gibt 'null' wenn' $ value = ‚C'' bitte, dass beheben zu akzeptieren die Antwort. Danke @Dmitry. – yceruto
Entschuldigung, ich fand eine andere Lösung, um das zu tun, danke trotzdem;) – yceruto