• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

systemsdk / docker-symfony-api / #74

pending completion
#74

push

DKravtsov
Php 8.2, symfony 6.2, updated RabbitMQ, updated composer dependencies, refactoring.

51 of 51 new or added lines in 44 files covered. (100.0%)

1479 of 2668 relevant lines covered (55.43%)

23.59 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

80.7
/src/General/Infrastructure/Repository/Traits/RepositoryMethodsTrait.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace App\General\Infrastructure\Repository\Traits;
6

7
use App\General\Domain\Entity\Interfaces\EntityInterface;
8
use App\General\Domain\Rest\UuidHelper;
9
use App\General\Infrastructure\Rest\RepositoryHelper;
10
use Doctrine\DBAL\LockMode;
11
use Doctrine\ORM\AbstractQuery;
12
use Doctrine\ORM\NonUniqueResultException;
13
use Doctrine\ORM\NoResultException;
14
use Doctrine\ORM\OptimisticLockException;
15
use Doctrine\ORM\ORMException;
16
use Doctrine\ORM\ORMInvalidArgumentException;
17
use Doctrine\ORM\QueryBuilder;
18
use Doctrine\ORM\Tools\Pagination\Paginator;
19
use Doctrine\ORM\TransactionRequiredException;
20
use InvalidArgumentException;
21

22
use function array_column;
23

24
/**
25
 * Trait RepositoryMethodsTrait
26
 *
27
 * @package App\General
28
 */
29
trait RepositoryMethodsTrait
30
{
31
    /**
32
     * Wrapper for default Doctrine repository find method.
33
     *
34
     * @psalm-param LockMode::*|null $lockMode
35
     *
36
     * @throws TransactionRequiredException
37
     * @throws OptimisticLockException
38
     * @throws ORMInvalidArgumentException
39
     * @throws ORMException
40
     */
41
    public function find(
42
        string $id,
43
        ?int $lockMode = null,
44
        ?int $lockVersion = null,
45
        ?string $entityManagerName = null
46
    ): ?EntityInterface {
47
        $output = $this->getEntityManager($entityManagerName)->find(
16✔
48
            $this->getEntityName(),
16✔
49
            $id,
16✔
50
            $lockMode,
16✔
51
            $lockVersion
16✔
52
        );
16✔
53

54
        return $output instanceof EntityInterface ? $output : null;
16✔
55
    }
56

57
    /**
58
     * {@inheritdoc}
59
     *
60
     * @psalm-param string|AbstractQuery::HYDRATE_*|null $hydrationMode
61
     */
62
    public function findAdvanced(
63
        string $id,
64
        string | int | null $hydrationMode = null,
65
        string | null $entityManagerName = null
66
    ): null | array | EntityInterface {
67
        // Get query builder
68
        $queryBuilder = $this->getQueryBuilder(entityManagerName: $entityManagerName);
45✔
69
        // Process custom QueryBuilder actions
70
        $this->processQueryBuilder($queryBuilder);
45✔
71
        $queryBuilder
45✔
72
            ->where('entity.id = :id')
45✔
73
            ->setParameter('id', $id, UuidHelper::getType($id));
45✔
74
        /*
75
         * This is just to help debug queries
76
         *
77
         * dd($queryBuilder->getQuery()->getDQL(), $queryBuilder->getQuery()->getSQL());
78
         */
79

80
        return $queryBuilder->getQuery()->getOneOrNullResult($hydrationMode);
45✔
81
    }
82

83
    /**
84
     * {@inheritdoc}
85
     */
86
    public function findOneBy(array $criteria, ?array $orderBy = null, ?string $entityManagerName = null): ?object
87
    {
88
        $repository = $this->getEntityManager($entityManagerName)->getRepository($this->getEntityName());
47✔
89

90
        return $repository->findOneBy($criteria, $orderBy);
47✔
91
    }
92

93
    /**
94
     * {@inheritdoc}
95
     *
96
     * @psalm-return list<object|EntityInterface>
97
     */
98
    public function findBy(
99
        array $criteria,
100
        ?array $orderBy = null,
101
        ?int $limit = null,
102
        ?int $offset = null,
103
        ?string $entityManagerName = null
104
    ): array {
105
        return $this
×
106
            ->getEntityManager($entityManagerName)
×
107
            ->getRepository($this->getEntityName())
×
108
            ->findBy($criteria, $orderBy, $limit, $offset);
×
109
    }
110

111
    /**
112
     * {@inheritdoc}
113
     *
114
     * @return array<int, EntityInterface>
115
     */
116
    public function findByAdvanced(
117
        array $criteria,
118
        ?array $orderBy = null,
119
        ?int $limit = null,
120
        ?int $offset = null,
121
        ?array $search = null,
122
        ?string $entityManagerName = null
123
    ): array {
124
        // Get query builder
125
        $queryBuilder = $this->getQueryBuilder($criteria, $search, $orderBy, $limit, $offset, $entityManagerName);
11✔
126
        // Process custom QueryBuilder actions
127
        $this->processQueryBuilder($queryBuilder);
11✔
128
        /*
129
         * This is just to help debug queries
130
         *
131
         * dd($queryBuilder->getQuery()->getDQL(), $queryBuilder->getQuery()->getSQL());
132
         */
133
        RepositoryHelper::resetParameterCount();
11✔
134

135
        /** @psalm-suppress UndefinedInterfaceMethod */
136
        return (new Paginator($queryBuilder, true))->getIterator()->getArrayCopy();
11✔
137
    }
138

139
    /**
140
     * {@inheritdoc}
141
     *
142
     * @psalm-return list<object|EntityInterface>
143
     */
144
    public function findAll(?string $entityManagerName = null): array
145
    {
146
        return $this
×
147
            ->getEntityManager($entityManagerName)
×
148
            ->getRepository($this->getEntityName())
×
149
            ->findAll();
×
150
    }
151

152
    /**
153
     * {@inheritdoc}
154
     *
155
     * @return array<int, string>
156
     */
157
    public function findIds(?array $criteria = null, ?array $search = null, ?string $entityManagerName = null): array
158
    {
159
        // Get query builder
160
        $queryBuilder = $this->getQueryBuilder(
4✔
161
            criteria: $criteria,
4✔
162
            search: $search,
4✔
163
            entityManagerName: $entityManagerName
4✔
164
        );
4✔
165
        // Build query
166
        $queryBuilder
4✔
167
            ->select('entity.id')
4✔
168
            ->distinct();
4✔
169
        // Process custom QueryBuilder actions
170
        $this->processQueryBuilder($queryBuilder);
4✔
171
        /*
172
         * This is just to help debug queries
173
         *
174
         * dd($queryBuilder->getQuery()->getDQL(), $queryBuilder->getQuery()->getSQL());
175
         */
176
        RepositoryHelper::resetParameterCount();
4✔
177

178
        return array_column($queryBuilder->getQuery()->getArrayResult(), 'id');
4✔
179
    }
180

181
    /**
182
     * Generic count method to determine count of entities for specified criteria and search term(s).
183
     *
184
     * @throws InvalidArgumentException|NonUniqueResultException|NoResultException
185
     */
186
    public function countAdvanced(
187
        ?array $criteria = null,
188
        ?array $search = null,
189
        ?string $entityManagerName = null
190
    ): int {
191
        // Get query builder
192
        $queryBuilder = $this->getQueryBuilder(
6✔
193
            criteria: $criteria,
6✔
194
            search: $search,
6✔
195
            entityManagerName: $entityManagerName
6✔
196
        );
6✔
197
        // Build query
198
        $queryBuilder->select('COUNT(DISTINCT(entity.id))');
6✔
199
        // Process custom QueryBuilder actions
200
        $this->processQueryBuilder($queryBuilder);
6✔
201
        /*
202
         * This is just to help debug queries
203
         *
204
         * dd($queryBuilder->getQuery()->getDQL(), $queryBuilder->getQuery()->getSQL());
205
         */
206
        RepositoryHelper::resetParameterCount();
6✔
207

208
        return (int)$queryBuilder->getQuery()->getSingleScalarResult();
6✔
209
    }
210

211
    /**
212
     * Helper method to 'reset' repository entity table - in other words delete all records
213
     */
214
    public function reset(?string $entityManagerName = null): int
215
    {
216
        // Create query builder
217
        $queryBuilder = $this->createQueryBuilder(entityManagerName: $entityManagerName);
×
218
        // Define delete query
219
        $queryBuilder->delete();
×
220

221
        // Return deleted row count
222
        return (int)$queryBuilder->getQuery()->execute();
×
223
    }
224

225
    /**
226
     * Helper method to get QueryBuilder for current instance within specified default parameters.
227
     *
228
     * @param array<int|string, mixed>|null $criteria
229
     * @param array<string, string>|null $search
230
     * @param array<string, string>|null $orderBy
231
     *
232
     * @throws InvalidArgumentException
233
     */
234
    private function getQueryBuilder(
235
        ?array $criteria = null,
236
        ?array $search = null,
237
        ?array $orderBy = null,
238
        ?int $limit = null,
239
        ?int $offset = null,
240
        ?string $entityManagerName = null
241
    ): QueryBuilder {
242
        // Create new QueryBuilder for this instance
243
        $queryBuilder = $this->createQueryBuilder(entityManagerName: $entityManagerName);
64✔
244
        // Process normal and search term criteria
245
        RepositoryHelper::processCriteria($queryBuilder, $criteria);
64✔
246
        RepositoryHelper::processSearchTerms($queryBuilder, $this->getSearchColumns(), $search);
64✔
247
        RepositoryHelper::processOrderBy($queryBuilder, $orderBy);
64✔
248
        // Process limit and offset
249
        $queryBuilder->setMaxResults($limit);
64✔
250
        $queryBuilder->setFirstResult($offset ?? 0);
64✔
251

252
        return $queryBuilder;
64✔
253
    }
254
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc