Skip to content

[Form] use a choice label normalizer instead of violating ChoiceListFactoryInterface::createView #32955

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from

Conversation

Tobion
Copy link
Contributor

@Tobion Tobion commented Aug 5, 2019

Q A
Branch? 3.4
Bug fix? no
New feature? no
BC breaks? no
Deprecations? no
Tests pass? yes
Fixed tickets
License MIT
Doc PR

Continuation of #32935 which offers a slightly different implementation of #17798
This way, 'choice_label' => false does not need to be passed to \Symfony\Component\Form\ChoiceList\Factory\ChoiceListFactoryInterface::createView which violates @param callable|null $label. So we can add a real callable type in #32237

…mponent\Form\ChoiceList\Factory\ChoiceListFactoryInterface::createView params
@@ -312,6 +312,16 @@ public function configureOptions(OptionsResolver $resolver)
return $choiceTranslationDomain;
};

$choiceLabelNormalizer = function (Options $options, $choiceLabel) {
if (false === $choiceLabel) {
return function () {
Copy link
Member

@yceruto yceruto Aug 5, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I afraid we can't do this here, because you'll break things for people relying on the false value, e.g. false === $options['choice_label'].

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think that counts otherwise we would not be able to add or change any form option. But I'm fine to merge this PR to 4.4 only.

Copy link
Member

@yceruto yceruto Aug 5, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have (since 4.2) the ->setDeprecated() method to deprecate any form option before removing it or changing its value.

Tecnically this would look like a BC break to me.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you propose?

Copy link
Member

@yceruto yceruto Aug 5, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess deprecating to pass false to the createView method and make the normalization to callable before calling it, I only found one occurence: ChoiceType::createChoiceListView(), but likely must be done for all current implementations of ChoiceListFactoryInterface. Also that should be targeted to 4.4.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make the normalization to callable before calling it

Then there is no point in adding a deprecation as false will never be passed.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The point is, it's a public method, hence we can't add the callable type-hint to the $label argument without adding first a deprecation warning about not passing false.

Make the normalization to callable before calling to createView is the intended operation to get rid of the deprecation warning.

Copy link
Member

@yceruto yceruto Aug 5, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It will be nice to have ?callable $label for consistency with other arguments.
I agree with @yceruto — we should deprecate false. I can help with the deprecation if you wish.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Feel free to take over

@nicolas-grekas
Copy link
Member

Same as in #33074 (comment): I'm for updating the type annotation and declare it as callable|false|null, with proper runtime validation that throws a TypeError when appropriate.

@Tobion Tobion closed this Aug 13, 2019
@Tobion Tobion deleted the form-choice-label-normalizer branch August 13, 2019 02:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants