Skip to content

Commit

Permalink
feat(normalizer): allow normalizer to only work with registered mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
joelwurtz committed Mar 24, 2024
1 parent 07a2b6e commit 6f5d3d4
Show file tree
Hide file tree
Showing 21 changed files with 546 additions and 472 deletions.
19 changes: 15 additions & 4 deletions src/AutoMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use AutoMapper\Loader\ClassLoaderInterface;
use AutoMapper\Loader\EvalLoader;
use AutoMapper\Loader\FileLoader;
use AutoMapper\Metadata\MetadataFactory;
use AutoMapper\Metadata\MetadataRegistry;
use AutoMapper\Symfony\ExpressionLanguageProvider;
use AutoMapper\Transformer\PropertyTransformer\PropertyTransformerInterface;
Expand Down Expand Up @@ -61,7 +62,7 @@ public function __construct(
*/
public function getMapper(string $source, string $target): MapperInterface
{
$metadata = $this->metadataRegistry->getMapperMetadata($source, $target);
$metadata = $this->metadataRegistry->get($source, $target);
$className = $metadata->className;

if (\array_key_exists($className, $this->mapperRegistry)) {
Expand Down Expand Up @@ -153,7 +154,17 @@ public static function create(
}

$customTransformerRegistry = new PropertyTransformerRegistry($propertyTransformers);
$metadataRegistry = MetadataRegistry::create($configuration, $customTransformerRegistry, $transformerFactories, $classMetadataFactory, $nameConverter, $expressionLanguage, $eventDispatcher);
$metadataRegistry = new MetadataRegistry($configuration);
$metadataFactory = MetadataFactory::create(
$configuration,
$customTransformerRegistry,
$metadataRegistry,
$transformerFactories,
$classMetadataFactory,
$nameConverter,
$expressionLanguage,
$eventDispatcher
);

$mapperGenerator = new MapperGenerator(
new ClassDiscriminatorResolver($classDiscriminatorFromClassMetadata),
Expand All @@ -162,9 +173,9 @@ public static function create(
);

if (null === $cacheDirectory) {
$loader = new EvalLoader($mapperGenerator, $metadataRegistry);
$loader = new EvalLoader($mapperGenerator, $metadataFactory);
} else {
$loader = new FileLoader($mapperGenerator, $metadataRegistry, $cacheDirectory);
$loader = new FileLoader($mapperGenerator, $metadataFactory, $cacheDirectory);
}

return new self($loader, $customTransformerRegistry, $metadataRegistry, $expressionLanguageProvider);
Expand Down
3 changes: 3 additions & 0 deletions src/Loader/ClassLoaderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace AutoMapper\Loader;

use AutoMapper\Metadata\MapperMetadata;
use AutoMapper\Metadata\MetadataRegistry;

/**
* Loads (require) a mapping given metadata.
Expand All @@ -16,4 +17,6 @@
interface ClassLoaderInterface
{
public function loadClass(MapperMetadata $mapperMetadata): void;

public function buildMappers(MetadataRegistry $registry): bool;
}
10 changes: 8 additions & 2 deletions src/Loader/EvalLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use AutoMapper\Generator\MapperGenerator;
use AutoMapper\Metadata\MapperMetadata;
use AutoMapper\Metadata\MetadataFactory;
use AutoMapper\Metadata\MetadataRegistry;
use PhpParser\PrettyPrinter\Standard;
use PhpParser\PrettyPrinterAbstract;
Expand All @@ -23,15 +24,20 @@

public function __construct(
private MapperGenerator $generator,
private MetadataRegistry $metadataRegistry,
private MetadataFactory $metadataFactory,
) {
$this->printer = new Standard();
}

public function loadClass(MapperMetadata $mapperMetadata): void
{
$class = $this->generator->generate($this->metadataRegistry->getGeneratorMetadata($mapperMetadata->source, $mapperMetadata->target));
$class = $this->generator->generate($this->metadataFactory->getGeneratorMetadata($mapperMetadata->source, $mapperMetadata->target));

eval($this->printer->prettyPrint([$class]));
}

public function buildMappers(MetadataRegistry $registry): bool
{
return false;
}
}
14 changes: 12 additions & 2 deletions src/Loader/FileLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use AutoMapper\Generator\MapperGenerator;
use AutoMapper\Metadata\MapperMetadata;
use AutoMapper\Metadata\MetadataFactory;
use AutoMapper\Metadata\MetadataRegistry;
use PhpParser\PrettyPrinter\Standard;
use PhpParser\PrettyPrinterAbstract;
Expand All @@ -26,7 +27,7 @@ final class FileLoader implements ClassLoaderInterface

public function __construct(
private readonly MapperGenerator $generator,
private readonly MetadataRegistry $metadataRegistry,
private readonly MetadataFactory $metadataFactory,
private readonly string $directory,
private readonly bool $hotReload = true,
) {
Expand Down Expand Up @@ -58,6 +59,15 @@ public function loadClass(MapperMetadata $mapperMetadata): void
require $classPath;
}

public function buildMappers(MetadataRegistry $registry): bool
{
foreach ($registry as $metadata) {
$this->saveMapper($metadata);
}

return true;
}

/**
* @return string The generated class name
*/
Expand All @@ -66,7 +76,7 @@ public function saveMapper(MapperMetadata $mapperMetadata): string
$className = $mapperMetadata->className;
$classPath = $this->directory . \DIRECTORY_SEPARATOR . $className . '.php';

$generatorMetadata = $this->metadataRegistry->getGeneratorMetadata($mapperMetadata->source, $mapperMetadata->target);
$generatorMetadata = $this->metadataFactory->getGeneratorMetadata($mapperMetadata->source, $mapperMetadata->target);
$classCode = $this->printer->prettyPrint([$this->generator->generate($generatorMetadata)]);

$this->write($classPath, "<?php\n\n" . $classCode . "\n");
Expand Down
Loading

0 comments on commit 6f5d3d4

Please sign in to comment.