From 6a18209863a934446d21ad8bc82c83d4b7dee5e7 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 24 Aug 2017 12:15:05 -0500 Subject: [PATCH] global carbon serialization --- src/Illuminate/Support/Carbon.php | 39 ++++++++++++++++++++++++++++- tests/Support/SupportCarbonTest.php | 15 +++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Support/Carbon.php b/src/Illuminate/Support/Carbon.php index cd96db351d77..db1bdbef0121 100644 --- a/src/Illuminate/Support/Carbon.php +++ b/src/Illuminate/Support/Carbon.php @@ -2,10 +2,47 @@ namespace Illuminate\Support; +use JsonSerializable; use Carbon\Carbon as BaseCarbon; use Illuminate\Support\Traits\Macroable; -class Carbon extends BaseCarbon +class Carbon extends BaseCarbon implements JsonSerializable { use Macroable; + + /** + * The custom Carbon JSON serializer. + * + * @var callable|null + */ + protected static $serializer; + + /** + * Prepare the object for JSON serialization. + * + * @return array|string + */ + public function jsonSerialize() + { + if (static::$serializer) { + return call_user_func(static::$serializer, $this); + } + + $carbon = $this; + + return call_user_func(function () use ($carbon) { + return get_object_vars($carbon); + }); + } + + /** + * JSON serialize all Carbon instances using the given callback. + * + * @param callable $callback + * @return void + */ + public static function serializeUsing($callback) + { + static::$serializer = $callback; + } } diff --git a/tests/Support/SupportCarbonTest.php b/tests/Support/SupportCarbonTest.php index a1be282516d9..3717e41f4607 100644 --- a/tests/Support/SupportCarbonTest.php +++ b/tests/Support/SupportCarbonTest.php @@ -56,4 +56,19 @@ public function testCarbonRaisesExceptionWhenMacroIsNotFound() { Carbon::now()->nonExistingMacro(); } + + public function testCarbonAllowsCustomSerializer() + { + Carbon::serializeUsing(function ($carbon) { + return $carbon->getTimestamp(); + }); + + $carbon = Carbon::now(); + + $result = json_decode(json_encode(['carbon' => $carbon]), true); + + $this->assertTrue(is_numeric($result['carbon'])); + + Carbon::serializeUsing(null); + } }