Arsitektur
ArsitekturSOLID

SOLID

Gato GraphQL mengikuti pendekatan SOLID untuk arsitektur perangkat lunak, menyediakan berbagai entitas untuk menangani tanggung jawab yang berbeda, sehingga kode menjadi mudah dipelihara, dapat diperluas, dan mudah dipahami.

Berikut adalah cara entitas pengguna sudah disediakan oleh plugin. Tipe User disediakan melalui kode ini:

class UserTypeResolver extends AbstractTypeResolver
{
  public function getTypeName(): string
  {
    return 'User';
  }
 
  public function getSchemaTypeDescription(): ?string
  {
    return $this->translationAPI->__('Representation of a user', "users");
  }
 
  public function getID(object $user)
  {
    return $this->usersAPI->getUserId($user);
  }
 
  public function getTypeDataLoaderClass(): string
  {
    return UserTypeDataLoader::class;
  }
}

Type resolver tidak memuat objek langsung dari database, melainkan mendelegasikan tugas ini ke objek TypeDataLoader (pada contoh di atas, dari kelas UserTypeDataLoader).

Menambahkan field username, email, dan url ke tipe User dilakukan melalui objek FieldResolver dengan kode ini:

class UserFieldResolver extends AbstractDBDataFieldResolver
{
  public static function getClassesToAttachTo(): array
  {
    return [
      UserTypeResolver::class,
    ];
  }
 
  public static function getFieldNamesToResolve(): array
  {
    return [
      'username',
      'email',
      'url',
    ];
  }
 
  public function getSchemaFieldDescription(
    TypeResolverInterface $typeResolver,
    string $fieldName
  ): ?string {
    $descriptions = [
      'username' => $this->translationAPI->__("User's username handle", "users"),
      'email' => $this->translationAPI->__("User's email", "users"),
      'url' => $this->translationAPI->__("URL of the user's profile in the website", "users"),
    ];
    return $descriptions[$fieldName];
  }
 
  public function getSchemaFieldType(
    TypeResolverInterface $typeResolver,
    string $fieldName
  ): ?string {
    $types = [
      'username' => SchemaDefinition::TYPE_STRING,
      'email' => SchemaDefinition::TYPE_EMAIL,
      'url' => SchemaDefinition::TYPE_URL,
    ];
    return $types[$fieldName];
  }
 
  public function resolveValue(
    TypeResolverInterface $typeResolver,
    object $user,
    string $fieldName,
    array $fieldArgs = []
  ) {
    switch ($fieldName) {
      case 'username':
        return $this->usersAPI->getUserLogin($user);
 
      case 'email':
        return $this->usersAPI->getUserEmail($user);
 
      case 'url':
        return $this->usersAPI->getUserURL($user);
    }
 
    return null;
  }
}

Seperti yang dapat diamati, definisi sebuah field untuk skema GraphQL, beserta resolusinya, telah dibagi ke dalam sejumlah fungsi:

  • getSchemaFieldDescription
  • getSchemaFieldType
  • resolveValue

Fungsi-fungsi lainnya meliputi:

Kode ini lebih mudah dibaca dibandingkan jika semua fungsionalitas dipenuhi melalui satu fungsi tunggal, atau melalui array konfigurasi, sehingga memudahkan implementasi dan pemeliharaan resolver.