From 0003a7cf0dc0f5880e836e8e51231ab4e24adce7 Mon Sep 17 00:00:00 2001 From: Albert Peschar Date: Thu, 3 Nov 2022 11:39:37 +0200 Subject: [PATCH 1/3] Fix HasAttributes::getMutatedAttributes for classes with constructor args --- .../Eloquent/Concerns/HasAttributes.php | 17 ++++---- .../DatabaseConcernsHasAttributesTest.php | 41 +++++++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 tests/Database/DatabaseConcernsHasAttributesTest.php diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index 5225cc01207f..e6491c6d5e55 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -2145,25 +2145,26 @@ public function hasAppended($attribute) */ public function getMutatedAttributes() { - $class = static::class; - - if (! isset(static::$mutatorCache[$class])) { - static::cacheMutatedAttributes($class); + if (! isset(static::$mutatorCache[static::class])) { + static::cacheMutatedAttributes($this); } - return static::$mutatorCache[$class]; + return static::$mutatorCache[static::class]; } /** * Extract and cache all the mutated attributes of a class. * - * @param string $class + * @param mixed $classOrInstance * @return void */ - public static function cacheMutatedAttributes($class) + public static function cacheMutatedAttributes($classOrInstance) { + $reflectionClass = new ReflectionClass($classOrInstance); + $class = $reflectionClass->getName(); + static::$getAttributeMutatorCache[$class] = - collect($attributeMutatorMethods = static::getAttributeMarkedMutatorMethods($class)) + collect($attributeMutatorMethods = static::getAttributeMarkedMutatorMethods($classOrInstance)) ->mapWithKeys(function ($match) { return [lcfirst(static::$snakeAttributes ? Str::snake($match) : $match) => true]; })->all(); diff --git a/tests/Database/DatabaseConcernsHasAttributesTest.php b/tests/Database/DatabaseConcernsHasAttributesTest.php new file mode 100644 index 000000000000..a3b36c8fdfc1 --- /dev/null +++ b/tests/Database/DatabaseConcernsHasAttributesTest.php @@ -0,0 +1,41 @@ +getMutatedAttributes(); + $this->assertEquals(['some_attribute'], $attributes); + } + + public function testWithConstructorArguments() + { + $instance = new HasAttributesWithConstructorArguments(null); + $attributes = $instance->getMutatedAttributes(); + $this->assertEquals(['some_attribute'], $attributes); + } +} + +class HasAttributesWithoutConstructor +{ + use HasAttributes; + + public function someAttribute(): Attribute + { + return new Attribute(function () {}); + } +} + +class HasAttributesWithConstructorArguments extends HasAttributesWithoutConstructor +{ + public function __construct($someValue) + { + } +} From 9a5d3d0bbda7c379fe6607a3b70c497fead75f60 Mon Sep 17 00:00:00 2001 From: Albert Peschar Date: Thu, 3 Nov 2022 11:56:28 +0200 Subject: [PATCH 2/3] Fix code style --- tests/Database/DatabaseConcernsHasAttributesTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Database/DatabaseConcernsHasAttributesTest.php b/tests/Database/DatabaseConcernsHasAttributesTest.php index a3b36c8fdfc1..2e2159c4c102 100644 --- a/tests/Database/DatabaseConcernsHasAttributesTest.php +++ b/tests/Database/DatabaseConcernsHasAttributesTest.php @@ -29,7 +29,8 @@ class HasAttributesWithoutConstructor public function someAttribute(): Attribute { - return new Attribute(function () {}); + return new Attribute(function () { + }); } } From aa4dff733c873ad95eb6a367a3427148310b4e11 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Wed, 9 Nov 2022 09:05:21 -0600 Subject: [PATCH 3/3] formatting --- .../Database/Eloquent/Concerns/HasAttributes.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index e6491c6d5e55..d536d1fd0970 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -2155,13 +2155,14 @@ public function getMutatedAttributes() /** * Extract and cache all the mutated attributes of a class. * - * @param mixed $classOrInstance + * @param object|string $classOrInstance * @return void */ public static function cacheMutatedAttributes($classOrInstance) { - $reflectionClass = new ReflectionClass($classOrInstance); - $class = $reflectionClass->getName(); + $reflection = new ReflectionClass($classOrInstance); + + $class = $reflection->getName(); static::$getAttributeMutatorCache[$class] = collect($attributeMutatorMethods = static::getAttributeMarkedMutatorMethods($classOrInstance))