我以一对字段的形式存储价格:金额和货币。
如果我使用InputTypes,overblog / GraphQLBundle将以数组形式而不是Money对象的形式给我结果。
对于单个字段标量,我能够使用映射器将其自动转换为对象:
DateTime:
type: custom-scalar
config:
scalarType: '@=newObject("App\\GraphQL\\Type\\DateTimeType")'
class DateTimeType extends ScalarType
{
const FORMAT = 'Y-m-d H:i:s';
public function serialize($value)
{
return $value->format(self::FORMAT);
}
public function parseValue($value)
{
return DateTime::createFromFormat(self::FORMAT, $value);
}
public function parseLiteral($valueNode, ?array $variables = null)
{
return DateTime::createFromFormat(self::FORMAT, $valueNode->value);
}
}
我可以对多场标量做同样的事情吗?
如果是,那怎么办?
这大致就是我想要的:
InputPrice:
type: input-object
config:
scalarType: '@=newObject("App\\GraphQL\\Type\\PriceType")'
fields:
amount:
type: Int!
currency:
type: String!
class MoneyType extends ScalarType
{
public function serialize($money)
{
/** @var \Money\Money $money */
return [
'amount' => $money->getAmount(),
'currency' => $money->getCurrency()->getCode(),
];
}
public function parseValue($value)
{
return new \Money\Money($value['amount'], new \Money\Currency($value['currency']));
}
}