From 46e34a134f2d266048058e9fd1094fbe7f40a3dd Mon Sep 17 00:00:00 2001 From: Michael Dzjaparidze Date: Sat, 5 Jul 2025 15:03:33 +0200 Subject: [PATCH] feat: add as encrypted fluent cast --- .../Eloquent/Casts/AsEncryptedFluent.php | 33 +++++++++++++++++++ .../Eloquent/Concerns/HasAttributes.php | 3 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/Illuminate/Database/Eloquent/Casts/AsEncryptedFluent.php diff --git a/src/Illuminate/Database/Eloquent/Casts/AsEncryptedFluent.php b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedFluent.php new file mode 100644 index 00000000000..5b72d50f210 --- /dev/null +++ b/src/Illuminate/Database/Eloquent/Casts/AsEncryptedFluent.php @@ -0,0 +1,33 @@ + + */ + public static function castUsing(array $arguments) + { + return new class implements CastsAttributes + { + public function get($model, $key, $value, $attributes) + { + return isset($value) ? new Fluent(Json::decode(Crypt::decryptString($value))) : null; + } + + public function set($model, $key, $value, $attributes) + { + return isset($value) ? [$key => Crypt::encryptString(Json::encode($value))] : null; + } + }; + } +} diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index cce3cac5739..5aca56115f3 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -17,6 +17,7 @@ use Illuminate\Database\Eloquent\Casts\AsCollection; use Illuminate\Database\Eloquent\Casts\AsEncryptedArrayObject; use Illuminate\Database\Eloquent\Casts\AsEncryptedCollection; +use Illuminate\Database\Eloquent\Casts\AsEncryptedFluent; use Illuminate\Database\Eloquent\Casts\AsEnumArrayObject; use Illuminate\Database\Eloquent\Casts\AsEnumCollection; use Illuminate\Database\Eloquent\Casts\Attribute; @@ -2290,7 +2291,7 @@ public function originalIsEquivalent($key) return $this->fromJson($attribute) === $this->fromJson($original); } elseif ($this->isClassCastable($key) && Str::startsWith($this->getCasts()[$key], [AsEnumArrayObject::class, AsEnumCollection::class])) { return $this->fromJson($attribute) === $this->fromJson($original); - } elseif ($this->isClassCastable($key) && $original !== null && Str::startsWith($this->getCasts()[$key], [AsEncryptedArrayObject::class, AsEncryptedCollection::class])) { + } elseif ($this->isClassCastable($key) && $original !== null && Str::startsWith($this->getCasts()[$key], [AsEncryptedArrayObject::class, AsEncryptedCollection::class, AsEncryptedFluent::class])) { if (empty(static::currentEncrypter()->getPreviousKeys())) { return $this->fromEncryptedString($attribute) === $this->fromEncryptedString($original); }