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
32:32
created

Container   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 398
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
eloc 182
dl 0
loc 398
ccs 0
cts 91
cp 0
rs 10
c 0
b 0
f 0
wmc 25

17 Methods

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

516
            throw new DoctrineStaticMetaException('Exception getting service ' . $id, $e->/** @scrutinizer ignore-call */ getCode(), $e);
Loading history...
517
        }
518
    }
519
520
    /**
521
     * @param string $id
522
     * @SuppressWarnings(PHPMD.ShortVariable)
523
     *
524
     * @return bool|void
525
     */
526
    public function has($id)
527
    {
528
        return $this->container->has($id);
529
    }
530
}
531