Completed
Push — develop ( 20327f...69b019 )
by Neomerx
10:22 queued 02:22
created

FluteContainerConfigurator::configureContainer()   C

Complexity

Conditions 7
Paths 16

Size

Total Lines 81
Code Lines 46

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 46
CRAP Score 7

Importance

Changes 0
Metric Value
dl 0
loc 81
c 0
b 0
f 0
ccs 46
cts 46
cp 1
rs 6.5544
cc 7
eloc 46
nc 16
nop 1
crap 7

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php namespace Limoncello\Flute\Package;
2
3
use Doctrine\DBAL\Types\Type;
4
use Limoncello\Contracts\Application\ApplicationConfigurationInterface as A;
5
use Limoncello\Contracts\Application\CacheSettingsProviderInterface;
6
use Limoncello\Contracts\Application\ContainerConfiguratorInterface;
7
use Limoncello\Contracts\Container\ContainerInterface as LimoncelloContainerInterface;
8
use Limoncello\Contracts\Data\ModelSchemeInfoInterface;
9
use Limoncello\Contracts\Exceptions\ThrowableHandlerInterface;
10
use Limoncello\Contracts\Settings\SettingsProviderInterface;
11
use Limoncello\Flute\Adapters\PaginationStrategy;
12
use Limoncello\Flute\Contracts\Adapters\PaginationStrategyInterface;
13
use Limoncello\Flute\Contracts\Encoder\EncoderInterface;
14
use Limoncello\Flute\Contracts\FactoryInterface;
15
use Limoncello\Flute\Contracts\Http\Query\ParametersMapperInterface;
16
use Limoncello\Flute\Contracts\Http\Query\QueryParserInterface;
17
use Limoncello\Flute\Contracts\Http\Query\QueryValidatorFactoryInterface;
18
use Limoncello\Flute\Contracts\Schema\JsonSchemesInterface;
19
use Limoncello\Flute\Contracts\Validation\FormValidatorFactoryInterface;
20
use Limoncello\Flute\Contracts\Validation\JsonApiValidatorFactoryInterface;
21
use Limoncello\Flute\Factory;
22
use Limoncello\Flute\Http\Query\ParametersMapper;
23
use Limoncello\Flute\Http\Query\QueryParser;
24
use Limoncello\Flute\Http\Query\QueryValidatorFactory;
25
use Limoncello\Flute\Http\ThrowableHandlers\FluteThrowableHandler;
26
use Limoncello\Flute\Types\DateJsonApiStringType;
27
use Limoncello\Flute\Types\DateTimeJsonApiStringType;
28
use Limoncello\Flute\Types\JsonApiDateTimeType;
29
use Limoncello\Flute\Types\JsonApiDateType;
30
use Limoncello\Flute\Validation\Form\Execution\FormValidatorFactory;
31
use Limoncello\Flute\Validation\JsonApi\Execution\JsonApiValidatorFactory;
32
use Neomerx\JsonApi\Encoder\EncoderOptions;
33
use Psr\Container\ContainerInterface as PsrContainerInterface;
34
use Psr\Log\LoggerInterface;
35
36
/**
37
 * @package Limoncello\Flute
38
 *
39
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
40
 */
41
class FluteContainerConfigurator implements ContainerConfiguratorInterface
42
{
43
    /** @var callable */
44
    const CONFIGURE_EXCEPTION_HANDLER = [self::class, 'configureExceptionHandler'];
45
46
    /**
47
     * @inheritdoc
48
     *
49
     * @SuppressWarnings(PHPMD.StaticAccess)
50
     */
51 1
    public static function configureContainer(LimoncelloContainerInterface $container): void
52
    {
53 1
        $factory = new Factory($container);
54
55 1
        $container[FactoryInterface::class] = $factory;
56
57 1
        $container[JsonSchemesInterface::class] = function (PsrContainerInterface $container) use ($factory) {
58 1
            $settings     = $container->get(SettingsProviderInterface::class)->get(FluteSettings::class);
59 1
            $modelSchemes = $container->get(ModelSchemeInfoInterface::class);
60
61 1
            return $factory->createJsonSchemes($settings[FluteSettings::KEY_MODEL_TO_SCHEME_MAP], $modelSchemes);
62
        };
63
64 1
        $container[QueryParserInterface::class] = function (PsrContainerInterface $container) {
65 1
            return new QueryParser($container->get(PaginationStrategyInterface::class));
66
        };
67
68 1
        $container[ParametersMapperInterface::class] = function (PsrContainerInterface $container) {
69 1
            return new ParametersMapper($container->get(JsonSchemesInterface::class));
70
        };
71
72 1
        $container[EncoderInterface::class] = function (PsrContainerInterface $container) use ($factory) {
73
            /** @var JsonSchemesInterface $jsonSchemes */
74 1
            $jsonSchemes = $container->get(JsonSchemesInterface::class);
75 1
            $settings    = $container->get(SettingsProviderInterface::class)->get(FluteSettings::class);
76 1
            $encoder     = $factory->createEncoder($jsonSchemes, new EncoderOptions(
77 1
                $settings[FluteSettings::KEY_JSON_ENCODE_OPTIONS],
78 1
                $settings[FluteSettings::KEY_URI_PREFIX],
79 1
                $settings[FluteSettings::KEY_JSON_ENCODE_DEPTH]
80
            ));
81 1
            isset($settings[FluteSettings::KEY_META]) ? $encoder->withMeta($settings[FluteSettings::KEY_META]) : null;
82 1
            ($settings[FluteSettings::KEY_IS_SHOW_VERSION] ?? false) ? $encoder->withJsonApiVersion() : null;
83
84 1
            return $encoder;
85
        };
86
87 1
        $container[PaginationStrategyInterface::class] = function (PsrContainerInterface $container) {
88 1
            $settings = $container->get(SettingsProviderInterface::class)->get(FluteSettings::class);
89
90 1
            return new PaginationStrategy(
91 1
                $settings[FluteSettings::KEY_DEFAULT_PAGING_SIZE],
92 1
                $settings[FluteSettings::KEY_MAX_PAGING_SIZE]
93
            );
94
        };
95
96 1
        $container[JsonApiValidatorFactoryInterface::class] = function (PsrContainerInterface $container) {
97 1
            $factory = new JsonApiValidatorFactory($container);
98
99 1
            return $factory;
100
        };
101
102 1
        $container[FormValidatorFactoryInterface::class] = function (PsrContainerInterface $container) {
103 1
            $factory = new FormValidatorFactory($container);
104
105 1
            return $factory;
106
        };
107
108 1
        $container[QueryValidatorFactoryInterface::class] = function (PsrContainerInterface $container) {
109
            /** @var PaginationStrategyInterface $paginationStrategy */
110 1
            $paginationStrategy = $container->get(PaginationStrategyInterface::class);
111 1
            $settings           = $container->get(SettingsProviderInterface::class)->get(FluteSettings::class);
112 1
            $ruleSetsData       = $settings[FluteSettings::KEY_ATTRIBUTE_VALIDATION_RULE_SETS_DATA];
113 1
            $factory            = new QueryValidatorFactory($container, $paginationStrategy, $ruleSetsData);
114
115 1
            return $factory;
116
        };
117
118
        // register date/date time types
119 1
        if (Type::hasType(DateTimeJsonApiStringType::NAME) === false) {
120 1
            Type::addType(DateTimeJsonApiStringType::NAME, DateTimeJsonApiStringType::class);
121
        }
122 1
        if (Type::hasType(DateJsonApiStringType::NAME) === false) {
123 1
            Type::addType(DateJsonApiStringType::NAME, DateJsonApiStringType::class);
124
        }
125 1
        if (Type::hasType(JsonApiDateTimeType::NAME) === false) {
126 1
            Type::addType(JsonApiDateTimeType::NAME, JsonApiDateTimeType::class);
127
        }
128 1
        if (Type::hasType(JsonApiDateType::NAME) === false) {
129 1
            Type::addType(JsonApiDateType::NAME, JsonApiDateType::class);
130
        }
131
    }
132
133
    /**
134
     * @param LimoncelloContainerInterface $container
135
     *
136
     * @return void
137
     */
138
    public static function configureExceptionHandler(LimoncelloContainerInterface $container)
139
    {
140 1
        $container[ThrowableHandlerInterface::class] = function (PsrContainerInterface $container) {
141
            /** @var CacheSettingsProviderInterface $provider */
142 1
            $provider      = $container->get(CacheSettingsProviderInterface::class);
143 1
            $appConfig     = $provider->getApplicationConfiguration();
144 1
            $fluteSettings = $provider->get(FluteSettings::class);
145
146 1
            $isLogEnabled = $appConfig[A::KEY_IS_LOG_ENABLED];
147 1
            $isDebug      = $appConfig[A::KEY_IS_DEBUG];
148
149 1
            $ignoredErrorClasses = $fluteSettings[FluteSettings::KEY_DO_NOT_LOG_EXCEPTIONS_LIST__AS_KEYS];
150 1
            $codeForUnexpected   = $fluteSettings[FluteSettings::KEY_HTTP_CODE_FOR_UNEXPECTED_THROWABLE];
151
            $throwableConverter  =
152 1
                $fluteSettings[FluteSettings::KEY_THROWABLE_TO_JSON_API_EXCEPTION_CONVERTER] ?? null;
153
154
            /** @var EncoderInterface $encoder */
155 1
            $encoder = $container->get(EncoderInterface::class);
156
157 1
            $handler = new FluteThrowableHandler(
158 1
                $encoder,
159 1
                $ignoredErrorClasses,
160 1
                $codeForUnexpected,
161 1
                $isDebug,
162 1
                $throwableConverter
163
            );
164
165 1
            if ($isLogEnabled === true && $container->has(LoggerInterface::class) === true) {
166
                /** @var LoggerInterface $logger */
167 1
                $logger = $container->get(LoggerInterface::class);
168 1
                $handler->setLogger($logger);
169
            }
170
171 1
            return $handler;
172
        };
173
    }
174
}
175