我想在我的项目中使用值对象或字符串对象(DDD、Hexagonal、POO,毫无疑问(。我可以在大多数情况下完美地工作,但我找不到在Api平台GraphQl中使用它的方法。我尝试过Type、Normalizer和其他一些方法,但都没有结果。我认为这是一个模式问题,它不知道如何处理电子邮件类,并且被忽略了。
我的电子邮件类如下:
class Email
{
protected string $value;
private function __construct(string $email)
{
$this->value = $email;
}
public static function fromString(string $email): Email
{
Assert::maxLength($email, 255);
Assert::minLength($email, 3);
Assert::email($email);
return new self($email);
}
public function value(): string
{
return $this->value;
}
public function __toString()
{
return $this->value();
}
}
并在用户中使用:
/**
* @ApiResource
* @ORMTable(name="users")
* @ORMEntity()
*/
class User
{
/**
* @Groups("user")
* @ORMColumn(type="email", length=180, unique=true, nullable=true)
*/
protected ?Email $email;
}
我必须做多少事情才能进入我的graphql:\
query {
users {
edges {
node {
id
email
}
}
}
}
例如:
{
"data": {
"users": {
"edges": [
{
"node": {
"id": "/api/users/ac9f782e-e56e-4f36-9d78-bf563aa8f3e5",
"email": "user@emaple.com"
}
}
]
}
}
}
PD:我已经将条令持久性存储为纯字符串,我可以毫无问题地查询和保存User对象,但由于以下错误,我可以在api平台graphql中执行:
{
"errors": [
{
"message": "Cannot query field "email" on type "User".",
"extensions": {
"category": "graphql"
},
"locations": [
{
"line": 7,
"column": 9
}
]
}
]
}
我在TypeConverter上做了一个错误的检查,所以这就是我所要做的,以便正确地工作,创建一个简单的转换器:
final class TypeConverter implements TypeConverterInterface
{
private TypeConverterInterface $defaultTypeConverter;
public function __construct(TypeConverterInterface $defaultTypeConverter)
{
$this->defaultTypeConverter = $defaultTypeConverter;
}
/**
* {@inheritdoc}
*/
public function convertType(Type $type, bool $input, ?string $queryName, ?string $mutationName, string $resourceClass, string $rootResource, ?string $property, int $depth)
{
if (Email::class === $resourceClass) {
return GraphQLType::string();
}
return $this->defaultTypeConverter->convertType($type, $input, $queryName, $mutationName, $resourceClass, $rootResource, $property, $depth);
}
/**
* {@inheritdoc}
*/
public function resolveType(string $type): ?GraphQLType
{
return $this->defaultTypeConverter->resolveType($type);
}
}