Skip to content

Commit 922e6b2

Browse files
7ochemfranmomu
andauthored
[Tree] Add @template and @template-extends annotations to the Tree repositories (#2556)
* Added `@template` and `@template-extends` annotations to the Tree repositories * Add more generics --------- Co-authored-by: Fran Moreno <[email protected]>
1 parent daa263a commit 922e6b2

17 files changed

+76
-26
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ a release.
1818
---
1919

2020
## [Unreleased]
21+
### Added
22+
- Tree: Added `@template` and `@template-extends` annotations to the Tree repositories
23+
2124
### Changed
2225
- Dropped support for PHP < 7.4
2326
- Dropped support for Symfony < 5.4

example/app/Entity/Repository/CategoryRepository.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@
1111

1212
namespace App\Entity\Repository;
1313

14+
use App\Entity\Category;
1415
use Gedmo\Tree\Entity\Repository\NestedTreeRepository;
1516

17+
/**
18+
* @template-extends NestedTreeRepository<Category>
19+
*/
1620
final class CategoryRepository extends NestedTreeRepository
1721
{
1822
}

phpstan-baseline.neon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ parameters:
616616
path: tests/Gedmo/Timestampable/Fixture/ArticleCarbon.php
617617

618618
-
619-
message: "#^Property Gedmo\\\\Tests\\\\Tree\\\\MaterializedPathODMMongoDBRepositoryTest\\:\\:\\$repo \\(Gedmo\\\\Tree\\\\Document\\\\MongoDB\\\\Repository\\\\MaterializedPathRepository\\) does not accept Doctrine\\\\ORM\\\\EntityRepository\\<Gedmo\\\\Tests\\\\Tree\\\\Fixture\\\\Document\\\\Category\\>\\.$#"
619+
message: "#^Property Gedmo\\\\Tests\\\\Tree\\\\MaterializedPathODMMongoDBRepositoryTest\\:\\:\\$repo \\(Gedmo\\\\Tree\\\\Document\\\\MongoDB\\\\Repository\\\\MaterializedPathRepository\\<Gedmo\\\\Tests\\\\Tree\\\\Fixture\\\\Document\\\\Category\\>\\) does not accept Doctrine\\\\ORM\\\\EntityRepository\\<Gedmo\\\\Tests\\\\Tree\\\\Fixture\\\\Document\\\\Category\\>\\.$#"
620620
count: 1
621621
path: tests/Gedmo/Tree/MaterializedPathODMMongoDBRepositoryTest.php
622622

src/Tree/Document/MongoDB/Repository/AbstractTreeRepository.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@
2222
use Gedmo\Tree\TreeListener;
2323

2424
/**
25-
* @phpstan-extends DocumentRepository<object>
25+
* @template T of object
26+
*
27+
* @phpstan-extends DocumentRepository<T>
28+
*
29+
* @phpstan-implements RepositoryInterface<T>
2630
*/
2731
abstract class AbstractTreeRepository extends DocumentRepository implements RepositoryInterface
2832
{
@@ -40,6 +44,7 @@ abstract class AbstractTreeRepository extends DocumentRepository implements Repo
4044
*/
4145
protected $repoUtils;
4246

47+
/** @param ClassMetadata<T> $class */
4348
public function __construct(DocumentManager $em, UnitOfWork $uow, ClassMetadata $class)
4449
{
4550
parent::__construct($em, $uow, $class);

src/Tree/Document/MongoDB/Repository/MaterializedPathRepository.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
*
2525
* @author Gustavo Falco <[email protected]>
2626
* @author Gediminas Morkevicius <[email protected]>
27+
*
28+
* @template T of object
29+
*
30+
* @template-extends AbstractTreeRepository<T>
2731
*/
2832
class MaterializedPathRepository extends AbstractTreeRepository
2933
{

src/Tree/Entity/Repository/AbstractTreeRepository.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@
2323
use Gedmo\Tree\TreeListener;
2424

2525
/**
26-
* @phpstan-extends EntityRepository<object>
26+
* @template T of object
27+
*
28+
* @template-extends EntityRepository<T>
29+
*
30+
* @template-implements RepositoryInterface<T>
2731
*/
2832
abstract class AbstractTreeRepository extends EntityRepository implements RepositoryInterface
2933
{
@@ -41,6 +45,7 @@ abstract class AbstractTreeRepository extends EntityRepository implements Reposi
4145
*/
4246
protected $repoUtils;
4347

48+
/** @param ClassMetadata<T> $class */
4449
public function __construct(EntityManagerInterface $em, ClassMetadata $class)
4550
{
4651
parent::__construct($em, $class);

src/Tree/Entity/Repository/ClosureTreeRepository.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
*
2424
* @author Gustavo Adrian <[email protected]>
2525
* @author Gediminas Morkevicius <[email protected]>
26+
*
27+
* @template T of object
28+
*
29+
* @template-extends AbstractTreeRepository<T>
2630
*/
2731
class ClosureTreeRepository extends AbstractTreeRepository
2832
{

src/Tree/Entity/Repository/MaterializedPathRepository.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
*
2222
* @author Gustavo Falco <[email protected]>
2323
* @author Gediminas Morkevicius <[email protected]>
24+
*
25+
* @template T of object
26+
*
27+
* @template-extends AbstractTreeRepository<T>
2428
*/
2529
class MaterializedPathRepository extends AbstractTreeRepository
2630
{

src/Tree/Entity/Repository/NestedTreeRepository.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
*
2929
* @author Gediminas Morkevicius <[email protected]>
3030
*
31+
* @template T of object
32+
*
33+
* @template-extends AbstractTreeRepository<T>
34+
*
3135
* @method persistAsFirstChild($node)
3236
* @method persistAsFirstChildOf($node, $parent)
3337
* @method persistAsLastChild($node)

src/Tree/RepositoryInterface.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*
1717
* @author Gustavo Falco <[email protected]>
1818
* @author Gediminas Morkevicius <[email protected]>
19+
*
20+
* @template T of object
1921
*/
2022
interface RepositoryInterface extends RepositoryUtilsInterface
2123
{
@@ -26,6 +28,8 @@ interface RepositoryInterface extends RepositoryUtilsInterface
2628
* @param string $direction
2729
*
2830
* @return iterable<int|string, object>
31+
*
32+
* @phpstan-return iterable<int|string, T>
2933
*/
3034
public function getRootNodes($sortByField = null, $direction = 'asc');
3135

@@ -38,6 +42,10 @@ public function getRootNodes($sortByField = null, $direction = 'asc');
3842
* @param bool $includeNode Flag indicating whether the given node should be included in the results
3943
*
4044
* @return array<int|string, object>
45+
*
46+
* @phpstan-param T $node
47+
*
48+
* @phpstan-return iterable<int|string, T>
4149
*/
4250
public function getNodesHierarchy($node = null, $direct = false, array $options = [], $includeNode = false);
4351

@@ -53,6 +61,9 @@ public function getNodesHierarchy($node = null, $direct = false, array $options
5361
* @return iterable<int|string, object> List of children
5462
*
5563
* @phpstan-param 'asc'|'desc'|'ASC'|'DESC'|array<int, 'asc'|'desc'|'ASC'|'DESC'> $direction
64+
* @phpstan-param T|null $node
65+
*
66+
* @phpstan-return iterable<int|string, T>
5667
*/
5768
public function getChildren($node = null, $direct = false, $sortByField = null, $direction = 'ASC', $includeNode = false);
5869

0 commit comments

Comments
 (0)