Skip to content

Commit c1e6281

Browse files
[10.x] Can apply WithoutRelations to entire class (#48068)
* allow applying WithoutRelations to class * prove attribute does not interfere with other properties during serialization * refactoring --------- Co-authored-by: Taylor Otwell <[email protected]>
1 parent 777f1fe commit c1e6281

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

src/Illuminate/Queue/Attributes/WithoutRelations.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Attribute;
66

7-
#[Attribute(Attribute::TARGET_PROPERTY)]
7+
#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_PROPERTY)]
88
class WithoutRelations
99
{
1010
//

src/Illuminate/Queue/SerializesModels.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@ public function __serialize()
1919
{
2020
$values = [];
2121

22-
$properties = (new ReflectionClass($this))->getProperties();
22+
$reflectionClass = new ReflectionClass($this);
2323

24-
$class = get_class($this);
24+
[$class, $properties, $classLevelWithoutRelations] = [
25+
get_class($this),
26+
$reflectionClass->getProperties(),
27+
! empty($reflectionClass->getAttributes(WithoutRelations::class)),
28+
];
2529

2630
foreach ($properties as $property) {
2731
if ($property->isStatic()) {
@@ -48,7 +52,8 @@ public function __serialize()
4852

4953
$values[$name] = $this->getSerializedPropertyValue(
5054
$value,
51-
empty($property->getAttributes(WithoutRelations::class))
55+
! $classLevelWithoutRelations &&
56+
empty($property->getAttributes(WithoutRelations::class))
5257
);
5358
}
5459

tests/Integration/Queue/ModelSerializationTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,26 @@ public function test_it_respects_without_relations_attribute()
332332
);
333333
}
334334

335+
public function test_it_respects_without_relations_attribute_applied_to_class()
336+
{
337+
$user = User::create([
338+
'email' => '[email protected]',
339+
])->load(['roles']);
340+
341+
$serialized = serialize(new ModelSerializationAttributeTargetsClassTestClass($user, new DataValueObject('hello')));
342+
343+
$this->assertSame(
344+
'O:83:"Illuminate\Tests\Integration\Queue\ModelSerializationAttributeTargetsClassTestClass":2:{s:4:"user";O:45:"Illuminate\Contracts\Database\ModelIdentifier":5:{s:5:"class";s:39:"Illuminate\Tests\Integration\Queue\User";s:2:"id";i:1;s:9:"relations";a:0:{}s:10:"connection";s:7:"testing";s:15:"collectionClass";N;}s:5:"value";O:50:"Illuminate\Tests\Integration\Queue\DataValueObject":1:{s:5:"value";s:5:"hello";}}',
345+
$serialized
346+
);
347+
348+
/** @var ModelSerializationAttributeTargetsClassTestClass $unserialized */
349+
$unserialized = unserialize($serialized);
350+
351+
$this->assertFalse($unserialized->user->relationLoaded('roles'));
352+
$this->assertEquals('hello', $unserialized->value->value);
353+
}
354+
335355
public function test_serialization_types_empty_custom_eloquent_collection()
336356
{
337357
$class = new ModelSerializationTypedCustomCollectionTestClass(
@@ -526,6 +546,16 @@ public function __construct(User $user)
526546
}
527547
}
528548

549+
#[WithoutRelations]
550+
class ModelSerializationAttributeTargetsClassTestClass
551+
{
552+
use SerializesModels;
553+
554+
public function __construct(public User $user, public DataValueObject $value)
555+
{
556+
}
557+
}
558+
529559
class ModelRelationSerializationTestClass
530560
{
531561
use SerializesModels;
@@ -549,3 +579,10 @@ public function __construct($users)
549579
$this->users = $users;
550580
}
551581
}
582+
583+
class DataValueObject
584+
{
585+
public function __construct(public $value = 1)
586+
{
587+
}
588+
}

0 commit comments

Comments
 (0)