8000 Deprecation based on the value must be triggered only if they are pro… · symfony/symfony@aa247e2 · GitHub
[go: up one dir, main page]

Skip to content

Commit aa247e2

Browse files
committed
Deprecation based on the value must be triggered only if they are provided by the user
1 parent 74dffbb commit aa247e2

File tree

2 files changed

+72
-23
lines changed

2 files changed

+72
-23
lines changed

src/Symfony/Component/OptionsResolver/OptionsResolver.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -798,7 +798,7 @@ public function offsetGet($option)
798798

799799
// Shortcut for resolved options
800800
if (array_key_exists($option, $this->resolved)) {
801-
if (isset($this->deprecated[$option])) {
801+
if (isset($this->deprecated[$option]) && \is_string($this->deprecated[$option])) {
802802
@trigger_error(strtr($this->deprecated[$option], array('%name%' => $option)), E_USER_DEPRECATED);
803803
}
804804

@@ -953,9 +953,6 @@ public function offsetGet($option)
953953
if ('' !== $deprecationMessage) {
954954
@trigger_error(strtr($deprecationMessage, array('%name%' => $option)), E_USER_DEPRECATED);
955955
}
956-
957-
// Store result for next calls
958-
$this->deprecated[$option] = $deprecationMessage ?: null;
959956
}
960957

961958
// Normalize the validated option

src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php

Lines changed: 71 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -597,18 +597,6 @@ function (OptionsResolver $resolver) {
597597
2,
598598
);
599599

600-
yield 'It does not deprecates a missing option with default value' => array(
601-
function (OptionsResolver $resolver) {
602-
$resolver
603-
->setDefault('foo', null)
604-
->setDeprecated('foo')
605-
;
606-
},
607-
array(),
608-
null,
609-
0,
610-
);
611-
612600
yield 'It deprecates an option evaluated in another definition' => array(
613601
function (OptionsResolver $resolver) {
614602
// defined by superclass
@@ -618,7 +606,7 @@ function (OptionsResolver $resolver) {
618606
;
619607
// defined by subclass
620608
$resolver->setDefault('bar', function (Options $options) {
621-
return $options['foo'];
609+
return $options['foo']; // It a trigger deprecation
622610
});
623611
},
624612
array(),
@@ -651,16 +639,40 @@ function (OptionsResolver $resolver) {
651639
1,
652640
);
653641

654-
yield 'It ignores deprecation for missing option without default value' => array(
642+
yield 'It deprecates options based on the value only if they are provided by the user' => array(
655643
function (OptionsResolver $resolver) {
656644
$resolver
657-
->setDefined(array('foo', 'bar'))
658-
->setDeprecated('foo')
645+
->setDefined('foo')
646+
->setAllowedTypes('foo', array('null', 'bool'))
647+
->setDeprecated('foo', function (Options $options, $value) {
648+
if (!\is_bool($value)) {
649+
return 'Passing a value different than true or false is deprecated.';
650+
}
651+
652+
return '';
653+
})
654+
->setDefault('baz', null)
655+
->setAllowedTypes('baz', array('null', 'int'))
656+
->setDeprecated('baz', function (Options $options, $value) {
657+
if (!\is_int($value)) {
658+
return 'Not passing a integer is deprecated.';
659+
}
660+
661+
return '';
662+
})
663+
->setDefault('bar', function (Options $options) {
664+
$options['baz']; // It does not trigger a deprecation
665+
666+
return $options['foo']; // It does not trigger a deprecation
667+
})
659668
;
660669
},
661-
array('bar' => 'baz'),
662-
null,
663-
0,
670+
array('foo' => null), // It trigger a deprecation
671+
array(
672+
'type' => E_USER_DEPRECATED,
673+
'message' => 'Passing a value different than true or false is deprecated.',
674+
),
675+
1,
664676
);
665677

666678
yield 'It ignores deprecation if closure returns an empty string' => array(
@@ -698,6 +710,46 @@ function (OptionsResolver $resolver) {
698710
),
699711
1,
700712
);
713+
714+
yield 'It trigger deprecation for each evaluation' => array(
715+
function (OptionsResolver $resolver) {
716+
$resolver
717+
// defined by superclass
718+
->setDefined('foo')
719+
->setDeprecated('foo')
720+
// defined by subclass
721+
->setDefault('bar', function (Options $options) {
722+
return $options['foo']; // It trigger a deprecation
723+
})
724+
->setNormalizer('bar', function (Options $options, $value) {
725+
$options['foo']; // It trigger a deprecation
726+
$options['foo']; // It trigger a deprecation
727+
728+
return $value;
729+
})
730+
;
731+
},
732+
array('foo' => 'baz'), // It trigger a deprecation
733+
array(
734+
'type' => E_USER_DEPRECATED,
735+
'message' => 'The option "foo" is deprecated.',
736+
),
737+
4,
738+
);
739+
740+
yield 'It ignores deprecation if no option provided by the user' => array(
741+
function (OptionsResolver $resolver) {
742+
$resolver
743+
->setDefined('foo')
744+
->setDefault('bar', null)
745+
->setDeprecated('foo')
746+
->setDeprecated('bar')
747+
;
748+
},
749+
array(),
750+
null,
751+
0,
752+
);
701753
}
702754

703755
/**

0 commit comments

Comments
 (0)
0