使用映射器构建器配置器¶
MapperBuilderConfigurator是一个可重用的配置逻辑,可以应用于MapperBuilder实例。当需要在应用程序的多个位置应用相同的映射配置时,或者需要将配置逻辑作为包分发时,这非常有用。
在下面的示例中,我们将两个配置设置应用于单个类内的MapperBuilder ,但这可以包含任意数量的自定义,具体取决于应用程序的需求。
namespace My\App;
use CuyZ\Valinor\MapperBuilder;
use CuyZ\Valinor\Mapper\Configurator\MapperBuilderConfigurator;
final class ApplicationMappingConfigurator implements MapperBuilderConfigurator
{
public function configureMapperBuilder(MapperBuilder $builder): MapperBuilder
{
return $builder
->allowSuperfluousKeys()
->registerConstructor(
\My\App\CustomerId::fromString(...),
);
}
}
该配置器可以在MapperBuilder实例中注册:
$result = (new \CuyZ\Valinor\MapperBuilder())
->configureWith(new \My\App\ApplicationMappingConfigurator())
->mapper()
->map(\My\App\User::class, [
'id' => '604e4b36-5b76-4b1a-9e6c-02d5acb53a4d',
'name' => 'John Doe',
'extraField' => 'ignored because superfluous keys are allowed',
]);
组合多个配置器¶
可以组合多个配置器来组成最终配置。每个配置器都按顺序应用,允许分层和模块化配置。
namespace My\App;
use CuyZ\Valinor\MapperBuilder;
use CuyZ\Valinor\Mapper\Configurator\MapperBuilderConfigurator;
final class FlexibleMappingConfigurator implements MapperBuilderConfigurator
{
public function configureMapperBuilder(MapperBuilder $builder): MapperBuilder
{
return $builder
->allowScalarValueCasting()
->allowSuperfluousKeys();
}
}
final class DomainConstructorsConfigurator implements MapperBuilderConfigurator
{
public function configureMapperBuilder(MapperBuilder $builder): MapperBuilder
{
return $builder
->registerConstructor(
\My\App\CustomerId::fromString(...),
\My\App\Email::fromString(...),
);
}
}
$result = (new \CuyZ\Valinor\MapperBuilder())
->configureWith(
new \My\App\FlexibleMappingConfigurator(),
new \My\App\DomainConstructorsConfigurator(),
)
->mapper()
->map(\My\App\User::class, $someData);
这种方法使每个配置器专注于一个问题,使它们更容易独立测试和重用。