Skip to content

Commit 788a18f

Browse files
nunomadurospawnia
andauthored
Makes ModelNotFoundException generic (#41082)
Co-Authored-By: Benedikt Franke <[email protected]> Co-authored-by: Benedikt Franke <[email protected]>
1 parent 7d37bd1 commit 788a18f

File tree

9 files changed

+38
-20
lines changed

9 files changed

+38
-20
lines changed

src/Illuminate/Database/Eloquent/Builder.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ public function findMany($ids, $columns = ['*'])
426426
* @param array $columns
427427
* @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static|static[]
428428
*
429-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
429+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
430430
*/
431431
public function findOrFail($id, $columns = ['*'])
432432
{
@@ -523,7 +523,7 @@ public function updateOrCreate(array $attributes, array $values = [])
523523
* @param array $columns
524524
* @return \Illuminate\Database\Eloquent\Model|static
525525
*
526-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
526+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
527527
*/
528528
public function firstOrFail($columns = ['*'])
529529
{
@@ -562,7 +562,7 @@ public function firstOr($columns = ['*'], Closure $callback = null)
562562
* @param array|string $columns
563563
* @return \Illuminate\Database\Eloquent\Model
564564
*
565-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
565+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
566566
* @throws \Illuminate\Database\MultipleRecordsFoundException
567567
*/
568568
public function sole($columns = ['*'])
@@ -593,7 +593,7 @@ public function value($column)
593593
* @param string|\Illuminate\Database\Query\Expression $column
594594
* @return mixed
595595
*
596-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
596+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
597597
*/
598598
public function valueOrFail($column)
599599
{

src/Illuminate/Database/Eloquent/ModelNotFoundException.php

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,30 @@
55
use Illuminate\Database\RecordsNotFoundException;
66
use Illuminate\Support\Arr;
77

8+
/**
9+
* @template TModel of \Illuminate\Database\Eloquent\Model
10+
*/
811
class ModelNotFoundException extends RecordsNotFoundException
912
{
1013
/**
1114
* Name of the affected Eloquent model.
1215
*
13-
* @var string
16+
* @var class-string<TModel>
1417
*/
1518
protected $model;
1619

1720
/**
1821
* The affected model IDs.
1922
*
20-
* @var int|array
23+
* @var array<int, int|string>
2124
*/
2225
protected $ids;
2326

2427
/**
2528
* Set the affected Eloquent model and instance ids.
2629
*
27-
* @param string $model
28-
* @param int|array $ids
30+
* @param class-string<TModel> $model
31+
* @param array<int, int|string>|int|string $ids
2932
* @return $this
3033
*/
3134
public function setModel($model, $ids = [])
@@ -47,7 +50,7 @@ public function setModel($model, $ids = [])
4750
/**
4851
* Get the affected Eloquent model.
4952
*
50-
* @return string
53+
* @return class-string<TModel>
5154
*/
5255
public function getModel()
5356
{
@@ -57,7 +60,7 @@ public function getModel()
5760
/**
5861
* Get the affected Eloquent model IDs.
5962
*
60-
* @return int|array
63+
* @return array<int, int|string>
6164
*/
6265
public function getIds()
6366
{

src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ public function findMany($ids, $columns = ['*'])
692692
* @param array $columns
693693
* @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection
694694
*
695-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
695+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
696696
*/
697697
public function findOrFail($id, $columns = ['*'])
698698
{
@@ -744,7 +744,7 @@ public function first($columns = ['*'])
744744
* @param array $columns
745745
* @return \Illuminate\Database\Eloquent\Model|static
746746
*
747-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
747+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
748748
*/
749749
public function firstOrFail($columns = ['*'])
750750
{

src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ public function first($columns = ['*'])
291291
* @param array $columns
292292
* @return \Illuminate\Database\Eloquent\Model|static
293293
*
294-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
294+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
295295
*/
296296
public function firstOrFail($columns = ['*'])
297297
{
@@ -369,7 +369,7 @@ public function findMany($ids, $columns = ['*'])
369369
* @param array $columns
370370
* @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection
371371
*
372-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
372+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
373373
*/
374374
public function findOrFail($id, $columns = ['*'])
375375
{

src/Illuminate/Database/Eloquent/Relations/Relation.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public function getEager()
164164
* @param array|string $columns
165165
* @return \Illuminate\Database\Eloquent\Model
166166
*
167-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
167+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
168168
* @throws \Illuminate\Database\MultipleRecordsFoundException
169169
*/
170170
public function sole($columns = ['*'])

src/Illuminate/Routing/ImplicitRouteBinding.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class ImplicitRouteBinding
1818
* @param \Illuminate\Routing\Route $route
1919
* @return void
2020
*
21-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
21+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
2222
* @throws \Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException
2323
*/
2424
public static function resolveForRoute($container, $route)

src/Illuminate/Routing/RouteBinding.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ protected static function createClassBinding($container, $binding)
5353
* @param \Closure|null $callback
5454
* @return \Closure
5555
*
56-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
56+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
5757
*/
5858
public static function forModel($container, $class, $callback = null)
5959
{

src/Illuminate/Routing/Router.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ public static function toResponse($request, $response)
846846
* @param \Illuminate\Routing\Route $route
847847
* @return \Illuminate\Routing\Route
848848
*
849-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
849+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
850850
* @throws \Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException
851851
*/
852852
public function substituteBindings($route)
@@ -866,7 +866,7 @@ public function substituteBindings($route)
866866
* @param \Illuminate\Routing\Route $route
867867
* @return void
868868
*
869-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
869+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
870870
* @throws \Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException
871871
*/
872872
public function substituteImplicitBindings($route)
@@ -882,7 +882,7 @@ public function substituteImplicitBindings($route)
882882
* @param \Illuminate\Routing\Route $route
883883
* @return mixed
884884
*
885-
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
885+
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model>
886886
*/
887887
protected function performBinding($key, $value, $route)
888888
{
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
use Illuminate\Database\Eloquent\ModelNotFoundException;
4+
use function PHPStan\Testing\assertType;
5+
6+
/** @var ModelNotFoundException<User> $exception */
7+
$exception = new ModelNotFoundException();
8+
9+
assertType('array<int, int|string>', $exception->getIds());
10+
assertType('class-string<User>', $exception->getModel());
11+
12+
$exception->setModel(User::class, 1);
13+
$exception->setModel(User::class, [1]);
14+
$exception->setModel(User::class, '1');
15+
$exception->setModel(User::class, ['1']);

0 commit comments

Comments
 (0)