diff --git a/src/Illuminate/Database/Eloquent/Casts/AsCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsCollection.php index dcb7a23e527d..1b7d6418c7c2 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 { @@ -16,8 +17,12 @@ class AsCollection implements Castable */ public static function castUsing(array $arguments) { - return new class implements CastsAttributes + return new class($arguments) implements CastsAttributes { + public function __construct(protected array $arguments) + { + } + public function get($model, $key, $value, $attributes) { if (! isset($attributes[$key])) { @@ -26,7 +31,13 @@ public function get($model, $key, $value, $attributes) $data = Json::decode($attributes[$key]); - return is_array($data) ? new Collection($data) : null; + $collectionClass = $this->arguments[0] ?? Collection::class; + + if (! is_a($collectionClass, Collection::class, true)) { + throw new InvalidArgumentException('The provided class must extend ['.Collection::class.'].'); + } + + return is_array($data) ? new $collectionClass($data) : null; } public function set($model, $key, $value, $attributes) diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedCollection.php index 1efa4478e411..d1b2c2fd295f 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 { @@ -17,12 +18,22 @@ class AsEncryptedCollection implements Castable */ public static function castUsing(array $arguments) { - return new class implements CastsAttributes + return new class($arguments) implements CastsAttributes { + public function __construct(protected array $arguments) + { + } + 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.'].'); + } + if (isset($attributes[$key])) { - return new Collection(Json::decode(Crypt::decryptString($attributes[$key]))); + return new $collectionClass(Json::decode(Crypt::decryptString($attributes[$key]))); } return null;