New in Symfony 4.1: Added support for immutable dates in forms

Contributed by
Valentin Udaltsov
in #25582.

The DateTimeImmutable class was introduced in PHP 5.5. It provides the same API as DateTime, but when calling to its modify() or set*() methods, it returns a new DateTimeImmutable object to not change the original value.

In recent Symfony versions we added support for immutable dates in several parts of the framework. In Symfony 4.1 we finished a long-standing petition from the community to add support for immutable dates in Symfony Forms.

When building a form with a DateTimeType, DateType or TimeType field, set their input options to the new datetime_immutable value:

1
2
3
4
5
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;

$builder->add('startsAt', DateTimeType::class, array(
    'input' => 'datetime_immutable',
));

Now you can set a DateTimeImmutable object as the value of this field and when the form is submitted and valid, you'll get a DateTimeImmutable object back with the new value set by the user.

Comments

Thank you ! This is a great improvement :-)
I like the immutable dates.

But was it not better to create a DateTimeImmutableType instead of a primitive (the string) switch?
Or even better a 'immutable' => bool, as option to support immutable DTO's and other things too? (no input_immutable since the input and output are both immutable).
It would even be better if PHP changed the DateTimeImmutable to implement Immutable which does not allow to change properties. And then use the interface as a trigger instead of configuration :P
@Wesley
A new value in the 'input' option is a way better than a new 'immutable' option or new Type because 'input' option indicates the type of underlying data in model object along with 'string', 'datetime', etc.
So 'datetime_immutable' in 'input' option is a coherent solution.
Created a polyfill bundle for those who want to use this feature with Symfony >=2.8
ruwork/polyfill-form-dti-bundle
Login with SensioLabsConnect to post a comment