From 21ee3f2f102971a9e45e246e32120f7321112a31 Mon Sep 17 00:00:00 2001 From: Ostap Brehin Date: Tue, 28 Mar 2023 16:33:42 +0100 Subject: [PATCH 01/11] Add ability to set a custom collection class for the `AsCollection` cast --- src/Illuminate/Database/Eloquent/Casts/AsCollection.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index dcb7a23e527d..13328dcef299 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -16,8 +16,11 @@ class AsCollection implements Castable */ public static function castUsing(array $arguments) { - return new class implements CastsAttributes - { + return new class($arguments[0] ?? Collection::class) implements CastsAttributes { + public function __construct( + protected string $collectionClass, + ) {} + public function get($model, $key, $value, $attributes) { if (! isset($attributes[$key])) { @@ -26,7 +29,7 @@ public function get($model, $key, $value, $attributes) $data = Json::decode($attributes[$key]); - return is_array($data) ? new Collection($data) : null; + return is_array($data) ? new $this->collectionClass($data) : null; } public function set($model, $key, $value, $attributes) From afc034daed40fd7d84d636bc633039822aeee590 Mon Sep 17 00:00:00 2001 From: Ostap Brehin Date: Tue, 28 Mar 2023 16:42:52 +0100 Subject: [PATCH 02/11] Fix StyleCI --- src/Illuminate/Database/Eloquent/Casts/AsCollection.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index 13328dcef299..10d2a81f1ef8 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -16,10 +16,12 @@ class AsCollection implements Castable */ public static function castUsing(array $arguments) { - return new class($arguments[0] ?? Collection::class) implements CastsAttributes { + return new class($arguments[0] ?? Collection::class) implements CastsAttributes + { public function __construct( protected string $collectionClass, - ) {} + ) { + } public function get($model, $key, $value, $attributes) { From fe3f21872e14be71ba78e036a5300415f2bff2f0 Mon Sep 17 00:00:00 2001 From: Ostap Brehin Date: Tue, 28 Mar 2023 23:11:59 +0100 Subject: [PATCH 03/11] Pass all arguments instead of a collection class name --- .../Database/Eloquent/Casts/AsCollection.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index 10d2a81f1ef8..931acad5b868 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -16,11 +16,13 @@ class AsCollection implements Castable */ public static function castUsing(array $arguments) { - return new class($arguments[0] ?? Collection::class) implements CastsAttributes + return new class($arguments) implements CastsAttributes { - public function __construct( - protected string $collectionClass, - ) { + protected $arguments; + + public function __construct(array $arguments) + { + $this->arguments = $arguments; } public function get($model, $key, $value, $attributes) @@ -31,7 +33,9 @@ public function get($model, $key, $value, $attributes) $data = Json::decode($attributes[$key]); - return is_array($data) ? new $this->collectionClass($data) : null; + $collectionClass = $this->arguments[0] ?? Collection::class; + + return is_array($data) ? new $collectionClass($data) : null; } public function set($model, $key, $value, $attributes) From f66e6008fdf61c24ef31c45271b3de09a9d15562 Mon Sep 17 00:00:00 2001 From: Ostap Brehin Date: Tue, 28 Mar 2023 23:19:19 +0100 Subject: [PATCH 04/11] Ability to set a custom collection class in `AsEncryptedCollection` cast --- .../Eloquent/Casts/AsEncryptedCollection.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php index 1efa4478e411..9ee692d614cf 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php @@ -17,12 +17,21 @@ class AsEncryptedCollection implements Castable */ public static function castUsing(array $arguments) { - return new class implements CastsAttributes + return new class($arguments) implements CastsAttributes { + protected $arguments; + + public function __construct(array $arguments) + { + $this->arguments = $arguments; + } + public function get($model, $key, $value, $attributes) { + $collectionClass = $this->arguments[0] ?? Collection::class; + if (isset($attributes[$key])) { - return new Collection(Json::decode(Crypt::decryptString($attributes[$key]))); + return new $collectionClass(Json::decode(Crypt::decryptString($attributes[$key]))); } return null; From 99c1465fd433963dfdd0552b806b2e53ea5664f5 Mon Sep 17 00:00:00 2001 From: Ostap Brehin Date: Wed, 29 Mar 2023 14:16:44 +0100 Subject: [PATCH 05/11] Add check for a collection class --- src/Illuminate/Database/Eloquent/Casts/AsCollection.php | 5 +++++ .../Database/Eloquent/Casts/AsEncryptedCollection.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index 931acad5b868..981d0bf72d8a 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -5,6 +5,7 @@ use Illuminate\Contracts\Database\Eloquent\Castable; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Support\Collection; +use InvalidArgumentException; class AsCollection implements Castable { @@ -35,6 +36,10 @@ public function get($model, $key, $value, $attributes) $collectionClass = $this->arguments[0] ?? Collection::class; + if (! is_subclass_of($collectionClass, Collection::class)) { + throw new InvalidArgumentException('The provided class must be a Collection'); + } + return is_array($data) ? new $collectionClass($data) : null; } diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php index 9ee692d614cf..f5f3b71dc1ce 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php @@ -6,6 +6,7 @@ use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Crypt; +use InvalidArgumentException; class AsEncryptedCollection implements Castable { @@ -30,6 +31,10 @@ public function get($model, $key, $value, $attributes) { $collectionClass = $this->arguments[0] ?? Collection::class; + if (! is_subclass_of($collectionClass, Collection::class)) { + throw new InvalidArgumentException('The provided class must be a Collection'); + } + if (isset($attributes[$key])) { return new $collectionClass(Json::decode(Crypt::decryptString($attributes[$key]))); } From f39650b46f6f68cec86a839b7626ef1612efc7a7 Mon Sep 17 00:00:00 2001 From: Ostap Brehin Date: Wed, 29 Mar 2023 14:19:45 +0100 Subject: [PATCH 06/11] Revert "Add check for a collection class" This reverts commit 99c1465fd433963dfdd0552b806b2e53ea5664f5. --- src/Illuminate/Database/Eloquent/Casts/AsCollection.php | 5 ----- .../Database/Eloquent/Casts/AsEncryptedCollection.php | 5 ----- 2 files changed, 10 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index 981d0bf72d8a..931acad5b868 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -5,7 +5,6 @@ use Illuminate\Contracts\Database\Eloquent\Castable; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Support\Collection; -use InvalidArgumentException; class AsCollection implements Castable { @@ -36,10 +35,6 @@ public function get($model, $key, $value, $attributes) $collectionClass = $this->arguments[0] ?? Collection::class; - if (! is_subclass_of($collectionClass, Collection::class)) { - throw new InvalidArgumentException('The provided class must be a Collection'); - } - return is_array($data) ? new $collectionClass($data) : null; } diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php index f5f3b71dc1ce..9ee692d614cf 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php @@ -6,7 +6,6 @@ use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Crypt; -use InvalidArgumentException; class AsEncryptedCollection implements Castable { @@ -31,10 +30,6 @@ public function get($model, $key, $value, $attributes) { $collectionClass = $this->arguments[0] ?? Collection::class; - if (! is_subclass_of($collectionClass, Collection::class)) { - throw new InvalidArgumentException('The provided class must be a Collection'); - } - if (isset($attributes[$key])) { return new $collectionClass(Json::decode(Crypt::decryptString($attributes[$key]))); } From 0a623fc54aaebd944b6c3d1d9deeb8402627fbc4 Mon Sep 17 00:00:00 2001 From: Ostap Brehin Date: Fri, 31 Mar 2023 17:49:31 +0100 Subject: [PATCH 07/11] Switch to PHP 8 constructor property promotion syntax --- src/Illuminate/Database/Eloquent/Casts/AsCollection.php | 5 +---- .../Database/Eloquent/Casts/AsEncryptedCollection.php | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index 931acad5b868..b9b59cdc70cd 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -18,11 +18,8 @@ public static function castUsing(array $arguments) { return new class($arguments) implements CastsAttributes { - protected $arguments; - - public function __construct(array $arguments) + public function __construct(protected array $arguments) { - $this->arguments = $arguments; } public function get($model, $key, $value, $attributes) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php index 9ee692d614cf..44dd88191d03 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php @@ -19,11 +19,8 @@ public static function castUsing(array $arguments) { return new class($arguments) implements CastsAttributes { - protected $arguments; - - public function __construct(array $arguments) + public function __construct(protected array $arguments) { - $this->arguments = $arguments; } public function get($model, $key, $value, $attributes) From 9e7295f93fc0235bbccf21013114149688f1e9d6 Mon Sep 17 00:00:00 2001 From: Ostap Brehin Date: Fri, 31 Mar 2023 18:06:19 +0100 Subject: [PATCH 08/11] Add check for a collection class --- src/Illuminate/Database/Eloquent/Casts/AsCollection.php | 5 +++++ .../Database/Eloquent/Casts/AsEncryptedCollection.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index b9b59cdc70cd..d5d626c99702 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -5,6 +5,7 @@ use Illuminate\Contracts\Database\Eloquent\Castable; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Support\Collection; +use InvalidArgumentException; class AsCollection implements Castable { @@ -32,6 +33,10 @@ public function get($model, $key, $value, $attributes) $collectionClass = $this->arguments[0] ?? Collection::class; + if (! is_a($collectionClass, Collection::class, true)) { + throw new InvalidArgumentException('The provided class must be a Collection'); + } + return is_array($data) ? new $collectionClass($data) : null; } diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php index 44dd88191d03..74647a162883 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php @@ -6,6 +6,7 @@ use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Crypt; +use InvalidArgumentException; class AsEncryptedCollection implements Castable { @@ -27,6 +28,10 @@ public function get($model, $key, $value, $attributes) { $collectionClass = $this->arguments[0] ?? Collection::class; + if (! is_a($collectionClass, Collection::class, true)) { + throw new InvalidArgumentException('The provided class must be a Collection'); + } + if (isset($attributes[$key])) { return new $collectionClass(Json::decode(Crypt::decryptString($attributes[$key]))); } From 448eaa3a9959867549d42051367640469680742d Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 3 Apr 2023 14:37:29 -0500 Subject: [PATCH 09/11] formatting --- src/Illuminate/Database/Eloquent/Casts/AsCollection.php | 2 +- .../Database/Eloquent/Casts/AsEncryptedCollection.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index d5d626c99702..35f259fd8b74 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -34,7 +34,7 @@ public function get($model, $key, $value, $attributes) $collectionClass = $this->arguments[0] ?? Collection::class; if (! is_a($collectionClass, Collection::class, true)) { - throw new InvalidArgumentException('The provided class must be a Collection'); + throw new InvalidArgumentException('The provided class must extend ['.Collection::class.']'); } return is_array($data) ? new $collectionClass($data) : null; diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php index 74647a162883..4fce2dc09873 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php @@ -29,7 +29,7 @@ public function get($model, $key, $value, $attributes) $collectionClass = $this->arguments[0] ?? Collection::class; if (! is_a($collectionClass, Collection::class, true)) { - throw new InvalidArgumentException('The provided class must be a Collection'); + throw new InvalidArgumentException('The provided class must extend ['.Collection::class.']'); } if (isset($attributes[$key])) { From 2cc5dfa2c625a2d1a9c430b73c0bb11932a4152e Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 3 Apr 2023 14:40:36 -0500 Subject: [PATCH 10/11] Update AsCollection.php --- src/Illuminate/Database/Eloquent/Casts/AsCollection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index 35f259fd8b74..1b7d6418c7c2 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php @@ -34,7 +34,7 @@ public function get($model, $key, $value, $attributes) $collectionClass = $this->arguments[0] ?? Collection::class; if (! is_a($collectionClass, Collection::class, true)) { - throw new InvalidArgumentException('The provided class must extend ['.Collection::class.']'); + throw new InvalidArgumentException('The provided class must extend ['.Collection::class.'].'); } return is_array($data) ? new $collectionClass($data) : null; From 4c9cc22af73595f2d8223bf94391798cc42af1bb Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 3 Apr 2023 14:40:46 -0500 Subject: [PATCH 11/11] Update AsEncryptedCollection.php --- .../Database/Eloquent/Casts/AsEncryptedCollection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php index 4fce2dc09873..d1b2c2fd295f 100644 --- a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php @@ -29,7 +29,7 @@ public function get($model, $key, $value, $attributes) $collectionClass = $this->arguments[0] ?? Collection::class; if (! is_a($collectionClass, Collection::class, true)) { - throw new InvalidArgumentException('The provided class must extend ['.Collection::class.']'); + throw new InvalidArgumentException('The provided class must extend ['.Collection::class.'].'); } if (isset($attributes[$key])) {