Skip to content

Commit c2a9180

Browse files
authored
Return back fast serializer for builtin models (#97)
1 parent 77de2c1 commit c2a9180

File tree

6 files changed

+281
-307
lines changed

6 files changed

+281
-307
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"license": "MIT",
77
"require": {
88
"php": ">=8.2",
9-
"liquetsoft/fias-component": "^13.0",
9+
"liquetsoft/fias-component": "^13.1",
1010
"illuminate/database": "^8.0|^9.0|^10.0|^11.0",
1111
"illuminate/http": "^8.0|^9.0|^10.0|^11.0",
1212
"laravel/framework": "^8.0|^9.0|^10.0|^11.0"

generator/SerializerGenerator.php

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ protected function decorateClass(ClassType $class): void
7272
{
7373
$constants = [];
7474

75-
$denormalizeBody = "\$dataToPopulate = \$this->convertDataToInternalFormat(\$data);\n";
75+
$denormalizeBody = "if (!is_array(\$data)) {\n";
76+
$denormalizeBody .= " throw new InvalidArgumentException('Bad data parameter. Array instance is required');\n";
77+
$denormalizeBody .= "}\n\n";
7678
$denormalizeBody .= '$type = trim($type, " \t\n\r\0\x0B\\\\/");' . "\n\n";
7779
$denormalizeBody .= "\$entity = \$context[AbstractNormalizer::OBJECT_TO_POPULATE] ?? new \$type();\n\n";
7880
$denormalizeBody .= "if (!(\$entity instanceof Model)) {\n";
@@ -85,13 +87,12 @@ protected function decorateClass(ClassType $class): void
8587
$className = $this->unifyClassName($descriptor->getName());
8688
$constants[] = new Literal("{$className}::class => true");
8789
$denormalizeBody .= " case {$className}::class:\n";
88-
$denormalizeBody .= " \$extractedData = \$this->model{$className}DataExtractor(\$dataToPopulate);\n";
90+
$denormalizeBody .= " \$extractedData = \$this->model{$className}DataExtractor(\$data);\n";
8991
$denormalizeBody .= " break;\n";
9092
}
9193

9294
$denormalizeBody .= " default:\n";
9395
$denormalizeBody .= " throw new InvalidArgumentException(\"Can't find data extractor for '{\$type}' type\");\n";
94-
$denormalizeBody .= " break;\n";
9596
$denormalizeBody .= "}\n\n";
9697
$denormalizeBody .= "\$entity->setRawAttributes(\$extractedData);\n";
9798
$denormalizeBody .= "\n";
@@ -128,25 +129,6 @@ protected function decorateClass(ClassType $class): void
128129
->setBody('return FiasSerializerFormat::XML->isEqual($format) ? self::ALLOWED_ENTITIES : [];');
129130
$getSupportedTypes->addParameter('format')->setType('string')->setNullable(true);
130131

131-
$convertDataToInternalFormatBody = <<<EOT
132-
\$result = [];
133-
if (!is_array(\$data)) {
134-
return \$result;
135-
}
136-
137-
foreach (\$data as \$key => \$value) {
138-
\$newKey = strtolower(trim((string) \$key, " \\n\\r\\t\\v\\x00@"));
139-
\$result[\$newKey] = \$value;
140-
}
141-
142-
return \$result;
143-
EOT;
144-
$convertDataToInternalFormat = $class->addMethod('convertDataToInternalFormat')
145-
->setVisibility('private')
146-
->setReturnType('array')
147-
->setBody($convertDataToInternalFormatBody);
148-
$convertDataToInternalFormat->addParameter('data')->setType('mixed')->setNullable(false);
149-
150132
foreach ($descriptors as $descriptor) {
151133
$className = $this->unifyClassName($descriptor->getName());
152134
$entityMethod = $class->addMethod("model{$className}DataExtractor");
@@ -164,19 +146,23 @@ protected function decorateModelDataExtractor(Method $method, EntityDescriptor $
164146
$body = "return [\n";
165147
foreach ($descriptor->getFields() as $field) {
166148
$column = $this->unifyColumnName($field->getName());
149+
$arrayParamName = '@' . strtoupper($field->getName());
167150
$type = trim($field->getType() . '_' . $field->getSubType(), ' _');
168151
switch ($type) {
169152
case 'int':
170-
$varType = "(int) \$data['{$column}']";
153+
$varType = "(int) \$data['{$arrayParamName}']";
154+
$defaultValue = $field->isNullable() ? 'null' : '0';
171155
break;
172156
case 'string_date':
173-
$varType = "new DateTimeImmutable((string) \$data['{$column}'])";
157+
$varType = "new DateTimeImmutable((string) \$data['{$arrayParamName}'])";
158+
$defaultValue = 'null';
174159
break;
175160
default:
176-
$varType = "trim((string) \$data['{$column}'])";
161+
$varType = "trim((string) \$data['{$arrayParamName}'])";
162+
$defaultValue = $field->isNullable() ? 'null' : "''";
177163
break;
178164
}
179-
$body .= " '{$column}' => isset(\$data['{$column}']) ? {$varType} : null,\n";
165+
$body .= " '{$column}' => isset(\$data['{$arrayParamName}']) ? {$varType} : {$defaultValue},\n";
180166
}
181167
$body .= '];';
182168

0 commit comments

Comments
 (0)