Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/vasekpurchart/doctrine-date-time-immutable-types
Doctrine DBAL DateTimeImmutable types
https://github.com/vasekpurchart/doctrine-date-time-immutable-types
Last synced: 3 months ago
JSON representation
Doctrine DBAL DateTimeImmutable types
- Host: GitHub
- URL: https://github.com/vasekpurchart/doctrine-date-time-immutable-types
- Owner: VasekPurchart
- License: other
- Created: 2015-05-31T17:52:10.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2018-09-05T14:12:18.000Z (over 6 years ago)
- Last Synced: 2024-10-11T22:36:23.616Z (3 months ago)
- Language: PHP
- Homepage:
- Size: 43 KB
- Stars: 44
- Watchers: 5
- Forks: 7
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: license.md
Awesome Lists containing this project
README
Doctrine DBAL DateTimeImmutable Types
=====================================> In [Doctrine DBAL 2.6](https://github.com/doctrine/dbal/releases/tag/v2.6.0) immutable DateTime types were added, so if you are using that version or newer, you no longer need this package. If you cannot use that version (it requires PHP 7.1), keep using this package (you can find even PHP 5.6 version in the older versions).
### Why would I want to use immutable types?
All Doctrine date/time based types are using `DateTime` instances, which are mutable. This can lead to breaking encapsulation and therefore bugs. For two reasons:
1) You accidentally modify a date when you are doing some computation on it:
```php
createdDate;
}}
``````php
getCreatedDate()); // 2015-01-01 00:00:00
$logRow->getCreatedDate()->modify('+14 days');
var_dump($logRow->getCreatedDate()); // 2015-01-15 00:00:00
```2) Or you *do* intentionally try to update it, which fails because Doctrine will not see this:
```php
getRenewDate()->modify('+1 year');
$entityManager->persist($product);
// no updates will be fired because Doctrine could not detect change
// (objects are compared by identity)
$entityManager->flush();
```You can prevent this behaviour by returning a new instance (cloning) or using [`DateTimeImmutable`](http://php.net/manual/en/class.datetimeimmutable.php) (which returns a new instance when modified).
Installation
------------> If you are using Symfony, you can use [`vasek-purchart/doctrine-date-time-immutable-types-bundle`](https://github.com/VasekPurchart/Doctrine-Date-Time-Immutable-Types-Bundle/tree/1.0), which will take care of the integration.
Install package [`vasek-purchart/doctrine-date-time-immutable-types`](https://packagist.org/packages/vasek-purchart/doctrine-date-time-immutable-types) with [Composer](https://getcomposer.org/):
```
composer require vasek-purchart/doctrine-date-time-immutable-types
```Then you just need to [register the types](http://doctrine-orm.readthedocs.org/en/latest/cookbook/custom-mapping-types.html) you want:
```php
createdDate;
}}
``````php
getCreatedDate()); // 2015-01-01 00:00:00
$logRow->getCreatedDate()->modify('+14 days');
var_dump($logRow->getCreatedDate()); // 2015-01-01 00:00:00
```