Skip to content

Commit 41bbacc

Browse files
Replace ReflectionParameter::getClass for php 8
1 parent 1278d04 commit 41bbacc

File tree

1 file changed

+37
-4
lines changed

1 file changed

+37
-4
lines changed

src/Filters/FiltersScope.php

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
use Illuminate\Database\Eloquent\Model;
77
use Illuminate\Support\Arr;
88
use Illuminate\Support\Str;
9+
use ReflectionClass;
910
use ReflectionException;
1011
use ReflectionObject;
12+
use ReflectionParameter;
13+
use ReflectionUnionType;
1114
use Spatie\QueryBuilder\Exceptions\InvalidFilterValue;
1215

1316
class FiltersScope implements Filter
@@ -24,7 +27,10 @@ public function __invoke(Builder $query, $values, string $property): Builder
2427
$relation = $propertyParts->implode('.');
2528

2629
if ($relation) {
27-
return $query->whereHas($relation, function (Builder $query) use ($scope, $values) {
30+
return $query->whereHas($relation, function (Builder $query) use (
31+
$scope,
32+
$values
33+
) {
2834
return $query->$scope(...$values);
2935
});
3036
}
@@ -36,18 +42,18 @@ protected function resolveParameters(Builder $query, $values, string $scope): ar
3642
{
3743
try {
3844
$parameters = (new ReflectionObject($query->getModel()))
39-
->getMethod('scope'.ucfirst($scope))
45+
->getMethod('scope' . ucfirst($scope))
4046
->getParameters();
4147
} catch (ReflectionException $e) {
4248
return $values;
4349
}
4450

4551
foreach ($parameters as $parameter) {
46-
if (! optional($parameter->getClass())->isSubclassOf(Model::class)) {
52+
if (!optional($this->getClass($parameter))->isSubclassOf(Model::class)) {
4753
continue;
4854
}
4955

50-
$model = $parameter->getClass()->newInstance();
56+
$model = $this->getClass($parameter)->newInstance();
5157
$index = $parameter->getPosition() - 1;
5258
$value = $values[$index];
5359

@@ -62,4 +68,31 @@ protected function resolveParameters(Builder $query, $values, string $scope): ar
6268

6369
return $values;
6470
}
71+
72+
protected function getClass(ReflectionParameter $parameter): ?ReflectionClass
73+
{
74+
if (version_compare(PHP_VERSION, '8.0', '<')) {
75+
return $parameter->getClass();
76+
}
77+
78+
$type = $parameter->getType();
79+
80+
if (is_null($type)) {
81+
return null;
82+
}
83+
84+
if ($type instanceof ReflectionUnionType) {
85+
return null;
86+
}
87+
88+
if ($type->isBuiltin()) {
89+
return null;
90+
}
91+
92+
if ($type->getName() === 'self') {
93+
return $parameter->getDeclaringClass();
94+
}
95+
96+
return new ReflectionClass($type->getName());
97+
}
6598
}

0 commit comments

Comments
 (0)