|
| 1 | +<?php |
| 2 | + |
| 3 | +declare(strict_types=1); |
| 4 | + |
| 5 | +namespace Zenstruck\Foundry\Bundle\Maker\Factory; |
| 6 | + |
| 7 | +use Doctrine\ODM\MongoDB\Mapping\ClassMetadata as ODMClassMetadata; |
| 8 | +use Doctrine\ORM\Mapping\ClassMetadataInfo as ORMClassMetadata; |
| 9 | + |
| 10 | +/** |
| 11 | + * @internal |
| 12 | + */ |
| 13 | +final class DoctrineScalarFieldsDefaultPropertiesGuesser extends AbstractDoctrineDefaultPropertiesGuesser |
| 14 | +{ |
| 15 | + private const DEFAULTS = [ |
| 16 | + 'ARRAY' => '[],', |
| 17 | + 'ASCII_STRING' => 'self::faker()->text({length}),', |
| 18 | + 'BIGINT' => 'self::faker()->randomNumber(),', |
| 19 | + 'BLOB' => 'self::faker()->text(),', |
| 20 | + 'BOOLEAN' => 'self::faker()->boolean(),', |
| 21 | + 'DATE' => 'self::faker()->dateTime(),', |
| 22 | + 'DATE_MUTABLE' => 'self::faker()->dateTime(),', |
| 23 | + 'DATE_IMMUTABLE' => '\DateTimeImmutable::createFromMutable(self::faker()->dateTime()),', |
| 24 | + 'DATETIME_MUTABLE' => 'self::faker()->dateTime(),', |
| 25 | + 'DATETIME_IMMUTABLE' => '\DateTimeImmutable::createFromMutable(self::faker()->dateTime()),', |
| 26 | + 'DATETIMETZ_MUTABLE' => 'self::faker()->dateTime(),', |
| 27 | + 'DATETIMETZ_IMMUTABLE' => '\DateTimeImmutable::createFromMutable(self::faker()->dateTime()),', |
| 28 | + 'DECIMAL' => 'self::faker()->randomFloat(),', |
| 29 | + 'FLOAT' => 'self::faker()->randomFloat(),', |
| 30 | + 'INTEGER' => 'self::faker()->randomNumber(),', |
| 31 | + 'INT' => 'self::faker()->randomNumber(),', |
| 32 | + 'JSON' => '[],', |
| 33 | + 'JSON_ARRAY' => '[],', |
| 34 | + 'SIMPLE_ARRAY' => '[],', |
| 35 | + 'SMALLINT' => 'self::faker()->numberBetween(1, 32767),', |
| 36 | + 'STRING' => 'self::faker()->text({length}),', |
| 37 | + 'TEXT' => 'self::faker()->text({length}),', |
| 38 | + 'TIME_MUTABLE' => 'self::faker()->datetime(),', |
| 39 | + 'TIME_IMMUTABLE' => '\DateTimeImmutable::createFromMutable(self::faker()->datetime()),', |
| 40 | + ]; |
| 41 | + |
| 42 | + public function __invoke(MakeFactoryData $makeFactoryData, bool $allFields): void |
| 43 | + { |
| 44 | + /** @var ODMClassMetadata|ORMClassMetadata $metadata */ |
| 45 | + $metadata = $this->getClassMetadata($makeFactoryData); |
| 46 | + |
| 47 | + $ids = $metadata->getIdentifierFieldNames(); |
| 48 | + |
| 49 | + foreach ($metadata->fieldMappings as $property) { |
| 50 | + if ($property['embedded'] ?? false) { |
| 51 | + // skip ODM embedded |
| 52 | + continue; |
| 53 | + } |
| 54 | + |
| 55 | + $fieldName = $property['fieldName']; |
| 56 | + |
| 57 | + if (\str_contains($fieldName, '.')) { |
| 58 | + // this is a "subfield" of an ORM embeddable field. |
| 59 | + continue; |
| 60 | + } |
| 61 | + |
| 62 | + // ignore identifiers and nullable fields |
| 63 | + if ((!$allFields && ($property['nullable'] ?? false)) || \in_array($fieldName, $ids, true)) { |
| 64 | + continue; |
| 65 | + } |
| 66 | + |
| 67 | + $type = \mb_strtoupper($property['type']); |
| 68 | + $value = "null, // TODO add {$type} type manually"; |
| 69 | + $length = $property['length'] ?? ''; |
| 70 | + |
| 71 | + if (\array_key_exists($type, self::DEFAULTS)) { |
| 72 | + $value = self::DEFAULTS[$type]; |
| 73 | + } |
| 74 | + |
| 75 | + $makeFactoryData->addDefaultProperty($fieldName, \str_replace('{length}', (string) $length, $value)); |
| 76 | + } |
| 77 | + } |
| 78 | + |
| 79 | + public function supports(MakeFactoryData $makeFactoryData): bool |
| 80 | + { |
| 81 | + return $makeFactoryData->isPersisted(); |
| 82 | + } |
| 83 | +} |
0 commit comments