From 43d2c57d37b0e604ad6f52811e8901755a1aa3e0 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 12 Feb 2021 10:23:44 -0600 Subject: [PATCH 1/5] add array and collection object casts --- .../Database/Eloquent/Casts/ArrayObject.php | 40 +++++++++++++++++++ .../Database/Eloquent/Casts/AsArrayObject.php | 35 ++++++++++++++++ .../Database/Eloquent/Casts/AsCollection.php | 31 ++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 src/Illuminate/Database/Eloquent/Casts/ArrayObject.php create mode 100644 src/Illuminate/Database/Eloquent/Casts/AsArrayObject.php create mode 100644 src/Illuminate/Database/Eloquent/Casts/AsCollection.php diff --git a/src/Illuminate/Database/Eloquent/Casts/ArrayObject.php b/src/Illuminate/Database/Eloquent/Casts/ArrayObject.php new file mode 100644 index 000000000000..596ed836006b --- /dev/null +++ b/src/Illuminate/Database/Eloquent/Casts/ArrayObject.php @@ -0,0 +1,40 @@ +getArrayCopy()); + } + + /** + * Get the instance as an array. + * + * @return array + */ + public function toArray() + { + return $this->getArrayCopy(); + } + + /** + * Get the array that should be JSON serialized. + * + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/src/Illuminate/Database/Eloquent/Casts/AsArrayObject.php b/src/Illuminate/Database/Eloquent/Casts/AsArrayObject.php new file mode 100644 index 000000000000..8d950e2daff4 --- /dev/null +++ b/src/Illuminate/Database/Eloquent/Casts/AsArrayObject.php @@ -0,0 +1,35 @@ + json_encode($value)]; + } + + public function serialize($model, string $key, $value, array $attributes) + { + return $value->getArrayCopy(); + } + }; + } +} diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php new file mode 100644 index 000000000000..e96834f6e4d3 --- /dev/null +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -0,0 +1,31 @@ + json_encode($value)]; + } + }; + } +} From 1be6d4ba450e994c4fb032f0463942221023519a Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 12 Feb 2021 14:48:42 -0600 Subject: [PATCH 2/5] add encrypted counterparts --- .../Eloquent/Casts/AsEncryptedArrayObject.php | 36 +++++++++++++++++++ .../Eloquent/Casts/AsEncryptedCollection.php | 32 +++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/Illuminate/Database/Eloquent/Casts/AsEncryptedArrayObject.php create mode 100644 src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedArrayObject.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedArrayObject.php new file mode 100644 index 000000000000..b14fa8123e9b --- /dev/null +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedArrayObject.php @@ -0,0 +1,36 @@ + Crypt::encryptString(json_encode($value))]; + } + + public function serialize($model, string $key, $value, array $attributes) + { + return $value->getArrayCopy(); + } + }; + } +} diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php new file mode 100644 index 000000000000..bb4f288d4196 --- /dev/null +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php @@ -0,0 +1,32 @@ + Crypt::encryptString(json_encode($value))]; + } + }; + } +} From 570975566f0a7c42e8114f1f8d2b8d1322e55767 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 12 Feb 2021 15:00:54 -0600 Subject: [PATCH 3/5] add test --- ...ArrayObjectAndCollectionCustomCastTest.php | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php diff --git a/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php b/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php new file mode 100644 index 000000000000..3d54ba8ff1e9 --- /dev/null +++ b/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php @@ -0,0 +1,75 @@ +increments('id'); + $table->text('array_object'); + $table->text('collection'); + $table->timestamps(); + }); + } + + public function test_array_object_and_collection_casting() + { + $model = new TestEloquentModelWithCustomCast; + + $model->array_object = ['name' => 'Taylor']; + $model->collection = collect(['name' => 'Taylor']); + + $model->save(); + + $model = $model->fresh(); + + $this->assertEquals(['name' => 'Taylor'], $model->array_object->toArray()); + $this->assertEquals(['name' => 'Taylor'], $model->collection->toArray()); + + $model->array_object['age'] = 34; + $model->array_object['meta']['title'] = 'Developer'; + + $model->save(); + + $model = $model->fresh(); + + $this->assertEquals([ + 'name' => 'Taylor', + 'age' => 34, + 'meta' => ['title' => 'Developer'] + ], $model->array_object->toArray()); + } +} + +class TestEloquentModelWithCustomCast extends Model +{ + /** + * The attributes that aren't mass assignable. + * + * @var string[] + */ + protected $guarded = []; + + /** + * The attributes that should be cast to native types. + * + * @var array + */ + protected $casts = [ + 'array_object' => AsArrayObject::class, + 'collection' => AsCollection::class, + ]; +} From 2b3a1944d8995c623433a22218b2d8e61898b273 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 12 Feb 2021 15:01:23 -0600 Subject: [PATCH 4/5] Apply fixes from StyleCI (#36247) --- .../Database/DatabaseArrayObjectAndCollectionCustomCastTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php b/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php index 3d54ba8ff1e9..6f140fb74e10 100644 --- a/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php +++ b/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php @@ -49,7 +49,7 @@ public function test_array_object_and_collection_casting() $this->assertEquals([ 'name' => 'Taylor', 'age' => 34, - 'meta' => ['title' => 'Developer'] + 'meta' => ['title' => 'Developer'], ], $model->array_object->toArray()); } } From 9a8d2edc092542342c23b2cca4e998652486a946 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 12 Feb 2021 15:03:57 -0600 Subject: [PATCH 5/5] Fix tests --- .../DatabaseArrayObjectAndCollectionCustomCastTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php b/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php index 6f140fb74e10..7f5b8e30f220 100644 --- a/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php +++ b/tests/Integration/Database/DatabaseArrayObjectAndCollectionCustomCastTest.php @@ -17,7 +17,7 @@ protected function setUp(): void { parent::setUp(); - Schema::create('test_eloquent_model_with_custom_casts', function (Blueprint $table) { + Schema::create('test_eloquent_model_with_custom_array_object_casts', function (Blueprint $table) { $table->increments('id'); $table->text('array_object'); $table->text('collection'); @@ -27,7 +27,7 @@ protected function setUp(): void public function test_array_object_and_collection_casting() { - $model = new TestEloquentModelWithCustomCast; + $model = new TestEloquentModelWithCustomArrayObjectCast; $model->array_object = ['name' => 'Taylor']; $model->collection = collect(['name' => 'Taylor']); @@ -54,7 +54,7 @@ public function test_array_object_and_collection_casting() } } -class TestEloquentModelWithCustomCast extends Model +class TestEloquentModelWithCustomArrayObjectCast extends Model { /** * The attributes that aren't mass assignable.