-
-
Notifications
You must be signed in to change notification settings - Fork 9.7k
Closed
Labels
Description
This ticket is a follow-up to #5221.
Currently, it is a common practice to use form types by instantiating them directly instead of registering them in the DIC:
<?php
// (1) creating forms
$form = $this->createForm(new MyFormType());
// (2) adding fields
$builder->add('field', new MyFieldType());
// (3) declaring parent types
public function getParent()
{
return new MyParentType();
}
This practice has a series of advantages:
- Easy and rapid coding, no extra configuration needed.
- Support for IDE auto-completion.
But it also has limitations:
- If (1), (2) or (3) occurs multiple times during the same request (e.g. within a collection form), caching is impossible and degrades performance. Removing this performance impact means adding the affected types to the DIC and rewriting all code that uses them.
- (3) cannot inject dependencies into the parent type.
- (2) does not make use of type extensions.
Because of these inconsistencies, I suggest to deprecate this API and replace it by the following:
<?php
// (1) creating forms
$form = $this->createForm('Vendor\Bundle\Form\MyFormType');
$form = $this->createForm('VendorBundle:MyFormType');
$form = $this->createForm(MyFormType::class); // PHP 5.5
// (2) adding fields
$builder->add('field', 'Vendor\Bundle\Form\MyFieldType');
$builder->add('field', 'VendorBundle:MyFieldType');
$builder->add('field', MyFieldType::class); // PHP 5.5
// (3) declaring parent types
public function getParent()
{
return 'Vendor\Bundle\Form\MyParentType';
}
public function getParent()
{
return 'VendorBundle:MyParentType';
}
public function getParent()
{
return MyParentType::class; // PHP 5.5
}
The advantages of this approach are:
- Support for class names and registered types is identical. No difference in performance, support for type extensions etc.
- Easy and rapid coding, no extra configuration needed.
The downsides:
- No IDE support until PHP 5.5 [1] (except if IDEs add special treatment for form types).
- Types that receive arguments in their constructors must be registered in the DIC.
[1] assuming that https://wiki.php.net/rfc/class_name_scalars gets accepted