Blog

🦸🏿‍♂️ Gato GraphQL artık PHP 8.0'dan 7.1'e transpile ediliyor

Leonardo Losoviz
Yazan: Leonardo Losoviz ·

Bir süre önce PHP kodunu transpile etme sanatı hakkında yazdım:

PHP kodunu transpile etmek, geliştirme için en son PHP özelliklerini kullanmayı mümkün kılarken, daha geniş bir kullanıcı kitlesini hedeflemek amacıyla eklentiyi üretim ortamında eski bir PHP sürümüne dönüştürülmüş hâliyle yayınlamaya olanak tanır.

Son birkaç haftayı Gato GraphQL eklentisi için bu süreci daha da iyileştirerek geçirdim.

Artık bundan böyle gerekli PHP sürümünün PHP 8.0'a yükseltildiğini duyurmaktan mutluluk duyuyorum:

PHP minimum sürümü 8.0'a yükseltme

Eklenti artık PHP 8.0'a güvenebildiğinden, kod tabanındaki tüm PHP sınıflarının tüm özelliklerine union type'lar da dahil olmak üzere bir tür eklemeyi tamamlayabildim.

Harika!

İşte eklentiyi geliştirirken kullanılabilecek tüm yeni PHP 8.0 özelliklerinin özeti.

Yeni PHP 8.0 özellikleri

Gato GraphQL geliştirilirken aşağıdaki PHP 8.0 özellikleri artık kullanılabilir:

Her birinin bir örneğini, eklentide geliştirme için nasıl kullanıldıklarını ve graphql-api.zip oluşturulurken neye transpile edildiklerini görelim.

Union types

Kod örneği:

interface CustomPostTypeAPIInterface
{
  public function createCustomPost(array $data): string | int | null | Error;
}

Transpile edilmiş hâli:

interface CustomPostTypeAPIInterface
{
  public function createCustomPost(array $data)
}

mixed sözde tipi

Kod örneği:

interface CMSServiceInterface
{
  public function getOption(string $option, mixed $default = false): mixed;
}

Transpile edilmiş hâli:

interface CMSServiceInterface
{
  public function getOption(string $option, $default = false);
}

Nesnelerde ::class sihirli sabiti

Kod örneği:

foreach ($directiveResolvers as $directiveResolver) {
  $directiveResolverName = $directiveResolver->getDirectiveName();
  $this->directiveNameClasses[$directiveResolverName][] = $directiveResolver::class;
}

Transpile edilmiş hâli:

foreach ($directiveResolvers as $directiveResolver) {
  $directiveResolverName = $directiveResolver->getDirectiveName();
  $this->directiveNameClasses[$directiveResolverName][] = get_class($directiveResolver);
}

match ifadeleri

Kod örneği:

public function getSchemaFieldType(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
  $ret = match($fieldName) {
    'accessControlLists' => TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID),
    'cacheControlLists' => TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID),
    'fieldDeprecationLists' => TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID),
    'schemaConfigurations' => TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID),
    default => parent::getSchemaFieldType($typeResolver, $fieldName),
  };
  return $ret;
}

Transpile edilmiş hâli:

public function getSchemaFieldType(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
  switch ($fieldName) {
    case 'accessControlLists':
      $ret = TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID);
      break;
    case 'cacheControlLists':
      $ret = TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID);
      break;
    case 'fieldDeprecationLists':
      $ret = TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID);
      break;
    case 'schemaConfigurations':
      $ret = TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID);
      break;
    default:
      $ret = parent::getSchemaFieldType($typeResolver, $fieldName);
      break;
  }
  return $ret;
}

Yalnızca türe göre catch istisnaları

Kod örneği:

try {
  // ...
} catch (InvalidArgumentException) {
  return sprintf(
    '<p>%s</p>',
    \__('Oops, the documentation for this module is not available', 'graphql-api')
  );
}

Transpile edilmiş hâli:

try {
  // ...
} catch (InvalidArgumentException $exception) {
  return sprintf(
    '<p>%s</p>',
    \__('Oops, the documentation for this module is not available', 'graphql-api')
  );
}

Null-safe operatörü

Kod örneği:

public function getSchemaDirectiveDeprecationDescription(TypeResolverInterface $typeResolver): ?string
{
  return $this->getSchemaDefinitionResolver($typeResolver)?->getSchemaDirectiveDeprecationDescription($typeResolver);
}

Transpile edilmiş hâli:

public function getSchemaDirectiveDeprecationDescription(TypeResolverInterface $typeResolver): ?string
{
  return $this->getSchemaDefinitionResolver($typeResolver) ? $this->getSchemaDefinitionResolver($typeResolver)->getSchemaDirectiveDeprecationDescription($typeResolver) : null;
}

Sınıf yapıcısında özellik tanıtımı

Kod örneği:

abstract class AbstractEndpointResolver
{
  function __construct(protected EndpointHelpers $endpointHelpers)
  {
  }
}

Transpile edilmiş hâli:

 abstract class AbstractEndpointResolver
 {
  /**
   * @var \GraphQLAPI\GraphQLAPI\Services\Helpers\EndpointHelpers
   */
  protected $endpointHelpers;
 
  function __construct(EndpointHelpers $endpointHelpers)
  {
    $this->endpointHelpers = $endpointHelpers;
  }
}

Parametre listelerinde ve closure use listelerinde sona koyulan virgüller

Kod örneği:

public function resolveFieldTypeResolverClass(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
    switch ($fieldName) {
        case 'accessControlLists':
            return CustomPostTypeResolver::class;
    }
 
    return parent::resolveFieldTypeResolverClass(
        $typeResolver,
        $fieldName,
    );
}

Transpile edilmiş hâli:

public function resolveFieldTypeResolverClass(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
    switch ($fieldName) {
        case 'accessControlLists':
            return CustomPostTypeResolver::class;
    }
 
    return parent::resolveFieldTypeResolverClass($typeResolver, $fieldName);
}

Bültenimize abone olun

Gato GraphQL'deki tüm güncellemelerden haberdar olun.