GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Pull Request — master (#154)
by joseph
30:34
created

Container::get()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 6
rs 10
c 0
b 0
f 0
ccs 0
cts 4
cp 0
crap 6
1
<?php declare(strict_types=1);
2
3
namespace EdmondsCommerce\DoctrineStaticMeta;
4
5
// phpcs:disable
6
use Doctrine\Common\Cache\ArrayCache;
7
use Doctrine\Common\Cache\Cache;
8
use Doctrine\Common\Cache\FilesystemCache;
9
use Doctrine\ORM\EntityManagerInterface;
10
use Doctrine\ORM\Tools\SchemaTool;
11
use Doctrine\ORM\Tools\SchemaValidator;
12
use EdmondsCommerce\DoctrineStaticMeta\Builder\Builder;
13
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Action\CreateConstraintAction;
14
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Action\CreateDtosForAllEntitiesAction;
15
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Action\CreateEmbeddableAction;
16
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Action\CreateEntityAction;
17
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\CodeHelper;
18
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\CliConfigCommandFactory;
19
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\CreateConstraintCommand;
20
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\FinaliseBuildCommand;
21
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\GenerateEmbeddableFromArchetypeCommand;
22
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\GenerateEmbeddableSkeletonCommand;
23
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\GenerateEntityCommand;
24
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\GenerateFieldCommand;
25
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\GenerateRelationsCommand;
26
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\OverrideCreateCommand;
27
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\OverridesUpdateCommand;
28
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\RemoveUnusedRelationsCommand;
29
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\SetEmbeddableCommand;
30
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\SetFieldCommand;
31
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Command\SetRelationCommand;
32
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entities\EntityCreator;
33
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\DataTransferObjects\DtoCreator;
34
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Embeddable\FakerData\EmbeddableFakerDataCreator;
35
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Embeddable\Interfaces\HasEmbeddableInterfaceCreator;
36
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Embeddable\Interfaces\Objects\EmbeddableInterfaceCreator;
37
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Embeddable\Objects\EmbeddableCreator;
38
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Embeddable\Traits\HasEmbeddableTraitCreator;
39
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Factories\AbstractEntityFactoryCreator;
40
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Factories\EntityDtoFactoryCreator;
41
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Factories\EntityFactoryCreator;
42
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Interfaces\EntityInterfaceCreator;
43
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Repositories\AbstractEntityRepositoryCreator;
44
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Repositories\EntityRepositoryCreator;
45
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Entity\Savers\EntitySaverCreator;
46
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Validation\Constraints\EntityIsValidConstraintCreator;
47
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Validation\Constraints\EntityIsValidConstraintValidatorCreator;
48
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Validation\Constraints\PropertyConstraintCreator;
49
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Src\Validation\Constraints\PropertyConstraintValidatorCreator;
50
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Tests\Assets\Entity\Fixtures\EntityFixtureCreator;
51
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Tests\BootstrapCreator;
52
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Tests\Entities\AbstractEntityTestCreator;
53
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Creation\Tests\Entities\EntityTestCreator;
54
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Filesystem\Factory\FileFactory;
55
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Filesystem\Factory\FindReplaceFactory;
56
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Filesystem\File\Writer;
57
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Embeddable\ArchetypeEmbeddableGenerator;
58
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Embeddable\EntityEmbeddableSetter;
59
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\EntityGenerator;
60
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Field\AbstractTestFakerDataProviderUpdater;
61
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Field\EntityFieldSetter;
62
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Field\FieldGenerator;
63
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Field\IdTrait;
64
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Field\StandardLibraryTestGenerator;
65
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\FileCreationTransaction;
66
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\FindAndReplaceHelper;
67
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\RelationsGenerator;
68
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\NamespaceHelper;
69
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\PathHelper;
70
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\PostProcessor\CopyPhpstormMeta;
71
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\PostProcessor\EntityFormatter;
72
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\PostProcessor\FileOverrider;
73
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\ReflectionHelper;
74
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\TypeHelper;
75
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\UnusedRelationsRemover;
76
use EdmondsCommerce\DoctrineStaticMeta\Entity\DataTransferObjects\DtoFactory;
77
use EdmondsCommerce\DoctrineStaticMeta\Entity\Factory\EntityDependencyInjector;
78
use EdmondsCommerce\DoctrineStaticMeta\Entity\Factory\EntityFactory;
79
use EdmondsCommerce\DoctrineStaticMeta\Entity\Factory\EntityFactoryInterface;
80
use EdmondsCommerce\DoctrineStaticMeta\Entity\Fields\Factories\UuidFactory;
81
use EdmondsCommerce\DoctrineStaticMeta\Entity\Interfaces\Validation\EntityDataValidatorInterface;
82
use EdmondsCommerce\DoctrineStaticMeta\Entity\Repositories\RepositoryFactory;
83
use EdmondsCommerce\DoctrineStaticMeta\Entity\Savers\BulkEntitySaver;
84
use EdmondsCommerce\DoctrineStaticMeta\Entity\Savers\BulkEntityUpdater;
85
use EdmondsCommerce\DoctrineStaticMeta\Entity\Savers\BulkSimpleEntityCreator;
86
use EdmondsCommerce\DoctrineStaticMeta\Entity\Savers\EntitySaver;
87
use EdmondsCommerce\DoctrineStaticMeta\Entity\Savers\EntitySaverFactory;
88
use EdmondsCommerce\DoctrineStaticMeta\Entity\Testing\EntityGenerator\FakerDataFillerFactory;
89
use EdmondsCommerce\DoctrineStaticMeta\Entity\Testing\EntityGenerator\TestEntityGeneratorFactory;
90
use EdmondsCommerce\DoctrineStaticMeta\Entity\Testing\Fixtures\FixturesHelper;
91
use EdmondsCommerce\DoctrineStaticMeta\Entity\Validation\EntityDataValidator;
92
use EdmondsCommerce\DoctrineStaticMeta\Entity\Validation\EntityDataValidatorFactory;
93
use EdmondsCommerce\DoctrineStaticMeta\EntityManager\EntityManagerFactory;
94
use EdmondsCommerce\DoctrineStaticMeta\Exception\DoctrineStaticMetaException;
95
use EdmondsCommerce\DoctrineStaticMeta\Schema\Database;
96
use EdmondsCommerce\DoctrineStaticMeta\Schema\MysqliConnectionFactory;
97
use EdmondsCommerce\DoctrineStaticMeta\Schema\Schema;
98
use EdmondsCommerce\DoctrineStaticMeta\Schema\UuidFunctionPolyfill;
99
use EdmondsCommerce\DoctrineStaticMeta\Tests\Assets\TestCodeGenerator;
100
use Psr\Container\ContainerExceptionInterface;
101
use Psr\Container\ContainerInterface;
102
use Psr\Container\NotFoundExceptionInterface;
103
use Symfony\Component\DependencyInjection\ContainerBuilder;
104
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
105
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
106
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
107
use Symfony\Component\DependencyInjection\Reference;
108
use Symfony\Component\Filesystem\Filesystem;
109
use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
110
use Symfony\Component\Validator\ContainerConstraintValidatorFactory;
111
use Symfony\Component\Validator\Mapping\Cache\DoctrineCache;
112
113
// phpcs:enable
114
115
/**
116
 * Class Container
117
 *
118
 * @package EdmondsCommerce\DoctrineStaticMeta
119
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
120
 */
121
class Container implements ContainerInterface
122
{
123
    /**
124
     * This is the list of services managed by this container
125
     *
126
     * This list is used to also generate a PHPStorm meta data file which assists with dynamic type hinting when using
127
     * the container as a service locator
128
     *
129
     * @see ./../../.phpstorm.meta.php/container.meta.php
130
     */
131
    public const SERVICES = [
132
        \Ramsey\Uuid\UuidFactory::class,
133
        AbstractEntityFactoryCreator::class,
134
        AbstractEntityRepositoryCreator::class,
135
        AbstractEntityTestCreator::class,
136
        AbstractTestFakerDataProviderUpdater::class,
137
        ArchetypeEmbeddableGenerator::class,
138
        ArrayCache::class,
139
        BootstrapCreator::class,
140
        Builder::class,
141
        BulkEntitySaver::class,
142
        BulkSimpleEntityCreator::class,
143
        MysqliConnectionFactory::class,
144
        UuidFunctionPolyfill::class,
145
        BulkEntityUpdater::class,
146
        CliConfigCommandFactory::class,
147
        CodeHelper::class,
148
        Config::class,
149
        ContainerConstraintValidatorFactory::class,
150
        CopyPhpstormMeta::class,
151
        CreateConstraintAction::class,
152
        CreateConstraintCommand::class,
153
        CreateDtosForAllEntitiesAction::class,
154
        CreateEmbeddableAction::class,
155
        CreateEntityAction::class,
156
        Database::class,
157
        DoctrineCache::class,
158
        DtoCreator::class,
159
        DtoFactory::class,
160
        EmbeddableCreator::class,
161
        EmbeddableFakerDataCreator::class,
162
        EmbeddableInterfaceCreator::class,
163
        EntityCreator::class,
164
        EntityDataValidator::class,
165
        EntityDataValidatorFactory::class,
166
        EntityDependencyInjector::class,
167
        EntityDtoFactoryCreator::class,
168
        EntityEmbeddableSetter::class,
169
        EntityFactory::class,
170
        EntityFactoryCreator::class,
171
        EntityFieldSetter::class,
172
        EntityFixtureCreator::class,
173
        EntityFormatter::class,
174
        EntityGenerator::class,
175
        EntityInterfaceCreator::class,
176
        EntityIsValidConstraintCreator::class,
177
        EntityIsValidConstraintValidatorCreator::class,
178
        EntityManagerFactory::class,
179
        EntityManagerInterface::class,
180
        EntityRepositoryCreator::class,
181
        EntitySaver::class,
182
        EntitySaverCreator::class,
183
        EntitySaverFactory::class,
184
        EntityTestCreator::class,
185
        FakerDataFillerFactory::class,
186
        FieldGenerator::class,
187
        FileCreationTransaction::class,
188
        FileFactory::class,
189
        FileOverrider::class,
190
        Filesystem::class,
191
        FilesystemCache::class,
192
        FinaliseBuildCommand::class,
193
        FindAndReplaceHelper::class,
194
        FindReplaceFactory::class,
195
        FixturesHelper::class,
196
        GenerateEmbeddableFromArchetypeCommand::class,
197
        GenerateEmbeddableSkeletonCommand::class,
198
        GenerateEntityCommand::class,
199
        GenerateFieldCommand::class,
200
        GenerateRelationsCommand::class,
201
        HasEmbeddableInterfaceCreator::class,
202
        HasEmbeddableTraitCreator::class,
203
        IdTrait::class,
204
        NamespaceHelper::class,
205
        OverrideCreateCommand::class,
206
        OverridesUpdateCommand::class,
207
        PathHelper::class,
208
        PropertyConstraintCreator::class,
209
        PropertyConstraintValidatorCreator::class,
210
        ReflectionHelper::class,
211
        RelationsGenerator::class,
212
        RemoveUnusedRelationsCommand::class,
213
        RepositoryFactory::class,
214
        Schema::class,
215
        SchemaTool::class,
216
        SchemaValidator::class,
217
        SetEmbeddableCommand::class,
218
        SetFieldCommand::class,
219
        SetRelationCommand::class,
220
        StandardLibraryTestGenerator::class,
221
        TestCodeGenerator::class,
222
        TestEntityGeneratorFactory::class,
223
        TypeHelper::class,
224
        UnusedRelationsRemover::class,
225
        UuidFactory::class,
226
        Writer::class,
227
    ];
228
229
    public const ALIASES = [
230
        EntityFactoryInterface::class              => EntityFactory::class,
231
        EntityDataValidatorInterface::class        => EntityDataValidator::class,
232
        ConstraintValidatorFactoryInterface::class => ContainerConstraintValidatorFactory::class,
233
    ];
234
235
    public const NOT_SHARED_SERVICES = [
236
        FixturesHelper::class,
237
    ];
238
239
240
    /**
241
     * The directory that container cache files will be stored
242
     */
243
    public const CACHE_PATH = __DIR__ . '/../cache/';
244
245
    public const SYMFONY_CACHE_PATH = self::CACHE_PATH . '/container.symfony.php';
246
247
    /**
248
     * @var bool
249
     */
250
    private $useCache = false;
251
252
    /**
253
     * @var ContainerInterface
254
     */
255
    private $container;
256
257
    /**
258
     * @param bool $useCache
259
     *
260
     * @return Container
261
     */
262
    public function setUseCache(bool $useCache): Container
263
    {
264
        $this->useCache = $useCache;
265
266
        return $this;
267
    }
268
269
    /**
270
     * @param array $server - normally you would pass in $_SERVER
271
     *
272
     * @throws DoctrineStaticMetaException
273
     */
274
    public function buildSymfonyContainer(array $server): void
275
    {
276
        if (true === $this->useCache && file_exists(self::SYMFONY_CACHE_PATH)) {
277
            /** @noinspection PhpIncludeInspection */
278
            require self::SYMFONY_CACHE_PATH;
279
            $this->setContainer(new \ProjectServiceContainer());
280
281
            return;
282
        }
283
284
        try {
285
            $container = new ContainerBuilder();
286
            $this->addConfiguration($container, $server);
287
            $container->compile();
288
            $this->setContainer($container);
289
            $dumper = new PhpDumper($container);
290
            file_put_contents(self::SYMFONY_CACHE_PATH, $dumper->dump());
291
        } catch (ServiceNotFoundException | InvalidArgumentException $e) {
292
            throw new DoctrineStaticMetaException(
293
                'Exception building the container: ' . $e->getMessage(),
294
                $e->getCode(),
295
                $e
296
            );
297
        }
298
    }
299
300
    /**
301
     * Set a container instance
302
     *
303
     * @param ContainerInterface $container
304
     *
305
     * @return $this
306
     */
307
    public function setContainer(ContainerInterface $container): self
308
    {
309
        $this->container = $container;
310
311
        return $this;
312
    }
313
314
    /**
315
     * Build all the definitions, alias and other configuration for this container. Each of these steps need to be
316
     * carried out to allow the everything to work, however you may wish to change individual bits. Therefore this
317
     * method has been made final, but the individual methods can be overwritten if you extend off the class
318
     *
319
     * @param ContainerBuilder $containerBuilder
320
     * @param array            $server
321
     *
322
     * @throws \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
323
     * @throws \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
324
     */
325
    final public function addConfiguration(ContainerBuilder $containerBuilder, array $server): void
326
    {
327
        $this->autoWireServices($containerBuilder);
328
        $this->defineConfig($containerBuilder, $server);
329
        $this->defineCache($containerBuilder, $server);
330
        $this->defineEntityManager($containerBuilder);
331
        $this->configureValidationComponents($containerBuilder);
332
        $this->defineAliases($containerBuilder);
333
    }
334
335
    /**
336
     * This takes every class from the getServices method, auto wires them and marks them as public. You may wish to
337
     * override this if you want to mark certain classes as private
338
     *
339
     * @param ContainerBuilder $containerBuilder
340
     */
341
    public function autoWireServices(ContainerBuilder $containerBuilder): void
342
    {
343
        $services = $this->getServices();
344
        foreach ($services as $class) {
345
            $containerBuilder->autowire($class, $class)->setPublic(true);
346
        }
347
    }
348
349
    /**
350
     * This is a simple wrapper around the class constants. You can use this to add, remove, or replace individual
351
     * services that will be auto wired
352
     *
353
     * @return array
354
     */
355
    public function getServices(): array
356
    {
357
        return self::SERVICES;
358
    }
359
360
    /**
361
     * This is used to auto wire the config interface. It sets the $server param as a constructor argument and then
362
     * sets the concrete class as the implementation for the Interface. Override this if you wish to use different
363
     * logic for where the config comes from
364
     *
365
     * @param ContainerBuilder $containerBuilder
366
     * @param array            $server
367
     */
368
    public function defineConfig(ContainerBuilder $containerBuilder, array $server): void
369
    {
370
        $containerBuilder->getDefinition(Config::class)->setArgument('$server', $this->configVars($server));
371
        $containerBuilder->setAlias(ConfigInterface::class, Config::class);
372
    }
373
374
    /**
375
     * Take the $server array, normally a copy of $_SERVER, and pull out just the bits required by config
376
     *
377
     * @param array $server
378
     *
379
     * @return array
380
     */
381
    protected function configVars(array $server): array
382
    {
383
        $return = array_intersect_key(
384
            $server,
385
            array_flip(ConfigInterface::PARAMS)
386
        );
387
388
        return $return;
389
    }
390
391
    /**
392
     * This is used to auto wire the doctrine cache. If we are in dev mode then this will always use the Array Cache,
393
     * if not then the cache will be set to what is in the $server array. Override this method if you wish to use
394
     * different logic to handle caching
395
     *
396
     * @param ContainerBuilder $containerBuilder
397
     * @param array            $server
398
     */
399
    public function defineCache(ContainerBuilder $containerBuilder, array $server): void
400
    {
401
        $cacheDriver = $server[Config::PARAM_DOCTRINE_CACHE_DRIVER] ?? Config::DEFAULT_DOCTRINE_CACHE_DRIVER;
402
        $containerBuilder->autowire($cacheDriver)->setPublic(true);
403
        $this->configureFilesystemCache($containerBuilder);
404
        /**
405
         * Which Cache Driver is used for the Cache Interface?
406
         *
407
         * If Dev mode, we always use the Array Cache
408
         *
409
         * Otherwise, we use the Configured Cache driver (which defaults to Array Cache)
410
         */
411
        $cache = ($server[Config::PARAM_DEVMODE] ?? false) ? ArrayCache::class : $cacheDriver;
412
        $containerBuilder->setAlias(Cache::class, $cache)->setPublic(true);
413
        $containerBuilder->getDefinition(DoctrineCache::class)->addArgument(new Reference($cache))->setPublic(true);
414
    }
415
416
    private function configureFilesystemCache(ContainerBuilder $containerBuilder): void
417
    {
418
        $config = $this->getConfig($containerBuilder);
419
        $containerBuilder->getDefinition(FilesystemCache::class)
420
                         ->addArgument($config->get(Config::PARAM_FILESYSTEM_CACHE_PATH))
421
                         ->setPublic(true);
422
    }
423
424
    private function getConfig(ContainerBuilder $containerBuilder): Config
425
    {
426
        return $containerBuilder->get(Config::class);
427
    }
428
429
    /**
430
     * This is used to auto wire the entity manager. It first adds the DSM factory as the factory for the class, and
431
     * sets the Entity Manager as the implementation of the interface. Overrider this if you want to use your own
432
     * factory to create and configure the entity manager
433
     *
434
     * @param ContainerBuilder $container
435
     */
436
    public function defineEntityManager(ContainerBuilder $container): void
437
    {
438
        $container->getDefinition(EntityManagerInterface::class)
439
                  ->addArgument(new Reference(Config::class))
440
                  ->setFactory(
441
                      [
442
                          new Reference(EntityManagerFactory::class),
443
                          'getEntityManager',
444
                      ]
445
                  );
446
    }
447
448
    /**
449
     * Ensure we are using the container constraint validator factory so that custom validators with dependencies can
450
     * simply declare them as normal. Note that you will need to define each custom validator as a service in your
451
     * container.
452
     *
453
     * @param ContainerBuilder $containerBuilder
454
     */
455
    public function configureValidationComponents(ContainerBuilder $containerBuilder): void
456
    {
457
        $containerBuilder->getDefinition(EntityDataValidator::class)
458
                         ->setFactory(
459
                             [
460
                                 new Reference(EntityDataValidatorFactory::class),
461
                                 'buildEntityDataValidator',
462
                             ]
463
                         )->setShared(false);
464
    }
465
466
    public function defineAliases(ContainerBuilder $containerBuilder): void
467
    {
468
        foreach (self::ALIASES as $interface => $service) {
469
            $containerBuilder->setAlias($interface, $service)->setPublic(true);
470
        }
471
    }
472
473
    /**
474
     * Some service should not be Singletons (shared) but should always be a new instance
475
     *
476
     * @param ContainerBuilder $containerBuilder
477
     */
478
    public function updateNotSharedServices(ContainerBuilder $containerBuilder): void
479
    {
480
        foreach (self::NOT_SHARED_SERVICES as $service) {
481
            $containerBuilder->getDefinition($service)->setShared(false);
482
        }
483
    }
484
485
    /**
486
     * @param string $id
487
     *
488
     * @return mixed
489
     * @SuppressWarnings(PHPMD.ShortVariable)
490
     * @throws DoctrineStaticMetaException
491
     */
492
    public function get($id)
493
    {
494
        try {
495
            return $this->container->get($id);
496
        } catch (ContainerExceptionInterface | NotFoundExceptionInterface $e) {
497
            throw new DoctrineStaticMetaException('Exception getting service ' . $id, $e->getCode(), $e);
0 ignored issues
show
Bug introduced by
The method getCode() does not exist on Psr\Container\ContainerExceptionInterface. It seems like you code against a sub-type of said class. However, the method does not exist in Psr\Container\NotFoundExceptionInterface or Symfony\Component\Depend...tion\ExceptionInterface. Are you sure you never get one of those? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

497
            throw new DoctrineStaticMetaException('Exception getting service ' . $id, $e->/** @scrutinizer ignore-call */ getCode(), $e);
Loading history...
498
        }
499
    }
500
501
    /**
502
     * @param string $id
503
     * @SuppressWarnings(PHPMD.ShortVariable)
504
     *
505
     * @return bool|void
506
     */
507
    public function has($id)
508
    {
509
        return $this->container->has($id);
510
    }
511
}
512