Skip to content

Commit d78fd36

Browse files
authored
Merge pull request #56 from laravel/fix/improve-date-objects-serialization
[1.x] Fixes serialization of date carbon objects
2 parents 944c564 + 2d26693 commit d78fd36

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"php": "^7.3|^8.0"
2222
},
2323
"require-dev": {
24+
"nesbot/carbon": "^2.61",
2425
"pestphp/pest": "^1.21.3",
2526
"phpstan/phpstan": "^1.8.2",
2627
"symfony/var-dumper": "^5.4.11"

src/Serializers/Native.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Laravel\SerializableClosure\Serializers;
44

55
use Closure;
6+
use DateTimeInterface;
67
use Laravel\SerializableClosure\Contracts\Serializable;
78
use Laravel\SerializableClosure\SerializableClosure;
89
use Laravel\SerializableClosure\Support\ClosureScope;
@@ -460,6 +461,12 @@ protected function mapByReference(&$data)
460461

461462
$instance = $data;
462463

464+
if ($data instanceof DateTimeInterface) {
465+
$this->scope[$instance] = $data;
466+
467+
return;
468+
}
469+
463470
if ($data instanceof UnitEnum) {
464471
$this->scope[$instance] = $data;
465472

tests/SerializerTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?php
22

3+
use Carbon\Carbon;
4+
use Carbon\CarbonImmutable;
35
use Laravel\SerializableClosure\SerializableClosure;
46
use Laravel\SerializableClosure\Serializers\Signed;
57
use Laravel\SerializableClosure\Support\ReflectionClosure;
@@ -401,6 +403,41 @@ function () {
401403
expect($f(new Model))->toBeInstanceOf(Model::class);
402404
})->with('serializers');
403405

406+
test('serializes used dates', function ($_, $date) {
407+
$closure = function () use ($date) {
408+
return $date;
409+
};
410+
411+
$u = s($closure);
412+
$r = $u();
413+
414+
expect($r)->toEqual($date);
415+
})->with('serializers')->with([
416+
new DateTime,
417+
new DateTimeImmutable,
418+
new Carbon,
419+
new CarbonImmutable,
420+
]);
421+
422+
test('serializes with used object date properties', function ($_, $date) {
423+
$obj = new ObjSelf;
424+
$obj->o = $date;
425+
426+
$closure = function () use ($obj) {
427+
return $obj;
428+
};
429+
430+
$u = s($closure);
431+
$r = $u();
432+
433+
expect($r->o)->toEqual($date);
434+
})->with('serializers')->with([
435+
new DateTime,
436+
new DateTimeImmutable,
437+
new Carbon,
438+
new CarbonImmutable,
439+
]);
440+
404441
class A
405442
{
406443
protected static function aStaticProtected()

0 commit comments

Comments
 (0)