-
-
Notifications
You must be signed in to change notification settings - Fork 9.7k
[Form] Made FormView and ChoiceView properties public for performance reasons #5004
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
Conversation
…to increase performance (PHP +200ms, Twig +150ms)
…for performance reasons (PHP +100ms)
…ected (PHP +30ms, Twig +30ms)
@@ -80,11 +79,45 @@ public function getFunctions() | |||
public function getFilters() | |||
{ | |||
return array( | |||
'humanize' => new \Twig_Filter_Method($this, 'renderer->humanize'), | |||
'humanize' => new \Twig_Filter_Method($this, 'renderer->humanize'), | |||
'is_choice_group' => new \Twig_Filter_Function('is_array', array('is_safe' => array('html'))), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why marking is_array as being html safe ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I kept this from the previous code. What is the implication of the "is_safe" setting?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
btw, why not using the core iterable
test available as of Twig 1.7 ? http://twig.sensiolabs.org/doc/tests/iterable.html
I don't think a choice can be iterable without being a choice group. Am I right ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is_safe is about disabling the auto-escaping on the output of a filter (if it is used to be displayed), which does not make sense here. So it would be better to remove it (someone looking at an existing twig extension should not see something marked as safe if there is not a good reason to do so as they could start marking unsafe things as safe).
It does not really matters for the form theme itself as it does not display the result but uses it as a test.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I used the iterable
test now.
@bschussek couldn't we keep the getters and setters for BC even if the rendering accesses the public properties directly ? |
@stof A BC layer for 2.0 is now included. People who upgraded to master already unfortunately need to adapt their code. |
public function getTests() | ||
{ | ||
return array( | ||
'choicegroup' => new \Twig_Test_Function('is_array'), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
did you saw my previous comment about iterable
? It would require bumping the Twig requirement to 1.7+ but this is not an issue at all as Twig is fully BC (and already in 1.9)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I did see it later, it seems GH requires page refreshes in order to see added comments. The minimum Twig version for Symfony is 1.8 anyway, so I used iterable
now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
inline comments are indeed not refreshed automatically
👍 |
@@ -113,9 +113,9 @@ CHANGELOG | |||
* deprecated the methods `getDefaultOptions` and `getAllowedOptionValues` | |||
in FormTypeInterface and FormTypeExtensionInterface | |||
* options passed during construction can now be accessed from FormConfigInterface | |||
* added FormBuilderInterface, FormViewInterface and FormConfigEditorInterface | |||
* added FormBuilderInterface, FormView and FormConfigEditorInterface |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is wrong. FormView has not been added
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed.
Commits ------- 24b764e [Form] Fixed issues mentioned in the PR 9216816 [Form] Turned Twig filters into tests 310f985 [Form] Added a layer of 2.0 BC methods to FormView and updated UPGRADE and CHANGELOG 5984b18 [Form] Precalculated the closure for deciding whether a choice is selected (PHP +30ms, Twig +30ms) 5dc3c39 [Form] Moved the access to templating helpers out of the choice loop for performance reasons (PHP +100ms) 0ef9acb [Form] Moved the method isChoiceSelected() to the ChoiceView class (PHP +150ms) 8b72766 [Form] Tweaked the generation of option tags for performance (PHP +200ms, Twig +50ms) 400c95b [Form] Replace methods in ChoiceView by public properties (PHP +100ms, Twig +400ms) d072f35 [Form] The properties of FormView are now accessed directly in order to increase performance (PHP +200ms, Twig +150ms) Discussion ---------- [Form] Made FormView and ChoiceView properties public for performance reasons Bug fix: no Feature addition: no Backwards compatibility break: **yes** Symfony2 tests pass: yes Fixes the following tickets: - Todo: - This PR changes the access to properties of `FormView` and `ChoiceView` objects from getters to direct property accesses. On [my example form](http://advancedform.gpserver.dk/app_dev.php/taxclasses/1) this improves rendering performance for **300ms** with PHP templates and **550ms** with Twig on my local machine. Unfortunately, this breaks BC both with 2.0 and with the current master in Form Types and PHP templates. Twig templates are not affected by this change. 2.0: ``` $formView->set('my_var', 'foobar'); $formView->get('my_var'); $formView->getChild('childName'); $formView['childName']; ``` master: ``` $formView->setVar('my_var', 'foobar'); $formView->getVar('my_var'); $formView->get('childName'); $formView['childName']; ``` this PR: ``` $formView->vars['my_var'] = 'foobar'; $formView->vars['my_var']; $formView->children['childName']; $formView['childName']; ``` Should we add methods to keep BC with 2.0? The second part of this PR contains improvements to the rendering of choice fields. These gain another **~500ms** for PHP templates and **80ms** for Twig. These improvements are BC, unless you overwrote the block "choice_widget_options" in your form themes which then needs to be adapted. **Update:** The PR now includes a BC layer for 2.0. --------------------------------------------------------------------------- by stof at 2012-07-21T11:37:41Z @bschussek couldn't we keep the getters and setters for BC even if the rendering accesses the public properties directly ? --------------------------------------------------------------------------- by bschussek at 2012-07-21T11:52:33Z @stof A BC layer for 2.0 is now included. People who upgraded to master already unfortunately need to adapt their code. --------------------------------------------------------------------------- by sstok at 2012-07-21T12:40:57Z :+1:
I'd suggest to leave |
Bug fix: no
Feature addition: no
Backwards compatibility break: yes
Symfony2 tests pass: yes
Fixes the following tickets: -
Todo: -
This PR changes the access to properties of
FormView
andChoiceView
objects from getters to direct property accesses. On my example form this improves rendering performance for 300ms with PHP templates and 550ms with Twig on my local machine.Unfortunately, this breaks BC both with 2.0 and with the current master in Form Types and PHP templates. Twig templates are not affected by this change.
2.0:
master:
this PR:
Should we add methods to keep BC with 2.0?
The second part of this PR contains improvements to the rendering of choice fields. These gain another ~500ms for PHP templates and 80ms for Twig. These improvements are BC, unless you overwrote the block "choice_widget_options" in your form themes which then needs to be adapted.
Update:
The PR now includes a BC layer for 2.0.