Skip to content

Commit 93868e3

Browse files
authored
Merge branch 'main' into feature/laravel-app-analyzer
2 parents 0bd97f0 + 79d3761 commit 93868e3

File tree

4 files changed

+58
-4
lines changed

4 files changed

+58
-4
lines changed

Diff for: docs/rector_rules_overview.md

+12-1
Original file line numberDiff line numberDiff line change
@@ -615,11 +615,22 @@ Add type hinting to where relation has methods e.g. `whereHas`, `orWhereHas`, `w
615615

616616
## EloquentWhereTypeHintClosureParameterRector
617617

618-
Change typehint of closure parameter in where method of Eloquent Builder
618+
Change typehint of closure parameter in where method of Eloquent or Query Builder
619619

620620
- class: [`RectorLaravel\Rector\MethodCall\EloquentWhereTypeHintClosureParameterRector`](../src/Rector/MethodCall/EloquentWhereTypeHintClosureParameterRector.php)
621621

622622
```diff
623+
/** @var \Illuminate\Contracts\Database\Query\Builder $query */
624+
-$query->where(function ($query) {
625+
+$query->where(function (\Illuminate\Contracts\Database\Query\Builder $query) {
626+
$query->where('id', 1);
627+
});
628+
```
629+
630+
<br>
631+
632+
```diff
633+
/** @var \Illuminate\Contracts\Database\Eloquent\Builder $query */
623634
-$query->where(function ($query) {
624635
+$query->where(function (\Illuminate\Contracts\Database\Eloquent\Builder $query) {
625636
$query->where('id', 1);

Diff for: src/Rector/MethodCall/EloquentWhereTypeHintClosureParameterRector.php

+29-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PhpParser\Node\Expr\StaticCall;
1212
use PhpParser\Node\Name;
1313
use PhpParser\Node\Name\FullyQualified;
14+
use PHPStan\Type\ObjectType;
1415
use RectorLaravel\AbstractRector;
1516
use RectorLaravel\NodeAnalyzer\QueryBuilderAnalyzer;
1617
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@@ -26,16 +27,34 @@ public function __construct(private readonly QueryBuilderAnalyzer $queryBuilderA
2627
public function getRuleDefinition(): RuleDefinition
2728
{
2829
return new RuleDefinition(
29-
'Change typehint of closure parameter in where method of Eloquent Builder',
30+
'Change typehint of closure parameter in where method of Eloquent or Query Builder',
3031
[
3132
new CodeSample(
3233
<<<'CODE_SAMPLE'
34+
/** @var \Illuminate\Contracts\Database\Query\Builder $query */
3335
$query->where(function ($query) {
3436
$query->where('id', 1);
3537
});
3638
CODE_SAMPLE
3739
,
3840
<<<'CODE_SAMPLE'
41+
/** @var \Illuminate\Contracts\Database\Query\Builder $query */
42+
$query->where(function (\Illuminate\Contracts\Database\Query\Builder $query) {
43+
$query->where('id', 1);
44+
});
45+
CODE_SAMPLE
46+
,
47+
),
48+
new CodeSample(
49+
<<<'CODE_SAMPLE'
50+
/** @var \Illuminate\Contracts\Database\Eloquent\Builder $query */
51+
$query->where(function ($query) {
52+
$query->where('id', 1);
53+
});
54+
CODE_SAMPLE
55+
,
56+
<<<'CODE_SAMPLE'
57+
/** @var \Illuminate\Contracts\Database\Eloquent\Builder $query */
3958
$query->where(function (\Illuminate\Contracts\Database\Eloquent\Builder $query) {
4059
$query->where('id', 1);
4160
});
@@ -92,7 +111,15 @@ private function changeClosureParamType(MethodCall|StaticCall $node): void
92111
return;
93112
}
94113

95-
$param->type = new FullyQualified('Illuminate\Contracts\Database\Query\Builder');
114+
$classOrVar = $node instanceof MethodCall
115+
? $node->var
116+
: $node->class;
117+
118+
$type = $this->isObjectType($classOrVar, new ObjectType('Illuminate\Database\Eloquent\Model'))
119+
? 'Illuminate\Contracts\Database\Eloquent\Builder'
120+
: 'Illuminate\Contracts\Database\Query\Builder';
121+
122+
$param->type = new FullyQualified($type);
96123
}
97124

98125
private function expectedObjectTypeAndMethodCall(MethodCall|StaticCall $node): bool
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace Illuminate\Contracts\Database\Eloquent;
4+
5+
use Illuminate\Contracts\Database\Query\Builder as BaseContract;
6+
7+
if (interface_exists('Illuminate\Contracts\Database\Eloquent\Builder')) {
8+
return;
9+
}
10+
11+
/**
12+
* This interface is intentionally empty and exists to improve IDE support.
13+
*
14+
* @mixin \Illuminate\Database\Eloquent\Builder
15+
*/
16+
interface Builder extends BaseContract {}

Diff for: tests/Rector/MethodCall/EloquentWhereTypeHintClosureParameterRector/Fixture/fixture2.php.inc

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace RectorLaravel\Tests\Rector\MethodCall\EloquentWhereTypeHintClosurePara
1717

1818
use RectorLaravel\Tests\Rector\MethodCall\EloquentWhereTypeHintClosureParameterRector\Source\FooModel;
1919

20-
FooModel::where(function (\Illuminate\Contracts\Database\Query\Builder $query) {
20+
FooModel::where(function (\Illuminate\Contracts\Database\Eloquent\Builder $query) {
2121
$query->where('id', 1)
2222
->orWhere('id', 2);
2323
});

0 commit comments

Comments
 (0)