使用规范化器配置器¶
NormalizerBuilderConfigurator是一段可重用的配置逻辑,可以应用于NormalizerBuilder实例。当需要在应用程序的多个位置应用相同的规范化配置,或者需要将配置逻辑作为包分发时,这非常有用。
在下面的示例中,我们将两个配置设置应用于单个类内的NormalizerBuilder ,但这可以包含任意数量的自定义,具体取决于应用程序的需求。
namespace My\App;
use CuyZ\Valinor\NormalizerBuilder;
use CuyZ\Valinor\Normalizer\Configurator\NormalizerBuilderConfigurator;
final class ApiResponseConfigurator implements NormalizerBuilderConfigurator
{
public function configureNormalizerBuilder(NormalizerBuilder $builder): NormalizerBuilder
{
return $builder
->registerTransformer(
fn (\DateTimeInterface $date) => $date->format('Y-m-d')
)
->registerTransformer(
fn (\My\App\Money $money) => [
'amount' => $money->amount,
'currency' => $money->currency->value,
]
);
}
}
该配置器可以在NormalizerBuilder实例中注册:
$json = (new \CuyZ\Valinor\NormalizerBuilder())
->configureWith(new \My\App\ApiResponseConfigurator())
->normalizer(\CuyZ\Valinor\Normalizer\Format::json())
->normalize($someObject);
组合多个配置器¶
可以组合多个配置器来组成最终配置。每个配置器都按顺序应用,使每个配置器都专注于一个问题。
namespace My\App;
use CuyZ\Valinor\NormalizerBuilder;
use CuyZ\Valinor\Normalizer\Configurator\NormalizerBuilderConfigurator;
final class DomainObjectConfigurator implements NormalizerBuilderConfigurator
{
public function configureNormalizerBuilder(NormalizerBuilder $builder): NormalizerBuilder
{
return $builder
->registerTransformer(
fn (\DateTimeInterface $date) => $date->format('Y-m-d')
)
->registerTransformer(
fn (\My\App\Money $money) => [
'amount' => $money->amount,
'currency' => $money->currency->value,
]
);
}
}
final class SensitiveDataConfigurator implements NormalizerBuilderConfigurator
{
public function configureNormalizerBuilder(NormalizerBuilder $builder): NormalizerBuilder
{
return $builder
->registerTransformer(
fn (\My\App\EmailAddress $email) => '***@' . $email->domain()
);
}
}
$json = (new \CuyZ\Valinor\NormalizerBuilder())
->configureWith(
new \My\App\DomainObjectConfigurator(),
new \My\App\SensitiveDataConfigurator(),
)
->normalizer(\CuyZ\Valinor\Normalizer\Format::json())
->normalize($someObject);
这种方法使每个配置器更容易独立测试和重用。