Alan Adı Yetenek Kancaları

1.6k görüntülenme Markdown

Bir alan adı yeteneğini servis sağlayıcı dışında bir sağlayıcıya devreden iki kanca.

Genel Bakış

Bir alan adı hizmeti tek bir modüle çözülür: kendi servis sağlayıcısına. Dolayısıyla servis sağlayıcı olmayan bir sağlayıcının kendine ait bir yeri yoktur. DNS sunucusu, yönlendirme servisi, WHOIS gizlilik sağlayıcısı: hiçbiri alan adı tescil edemez, hiçbiri o modül olamaz.

Bu iki kanca o kapıyı açar. Biri ekranların neyi sunacağına, diğeri çağrıyı kimin karşılayacağına karar verir. Devralmadığınız her yetenek servis sağlayıcıda kalır.

Yetenek adları ortaktır: nameservers, child_ns, transfer_lock, auth_code, dns_records, dns_edit, dnssec, email_forwarding, domain_forwarding, whois, whois_privacy.

İkisini birlikte kullanın. Yalnız matris, arkasında hiçbir şey olmayan bir sekme verir. Yalnız sağlayıcı, kimsenin ulaşamadığı bir yetenek verir.

Referans

Bir yeteneği açmak

filterdomain.capabilities
Hook::runRefs referansla dört ekrandan

Modül yoklaması bittikten sonra, sekmeler kurulmadan önce çalışır. Bu matrisi dört ekran ayrı ayrı hesaplar ve dördü de kancayı çağırır: müşteri paneli, müşteri API'si, yönetim paneli ve yönetim API'si.

Parametreler 2
$capsarrayrefYetenek matrisi, ad => bool. Dört ekranda da ham adlar; yönetim yanıtı bunları sonradan has_* olarak yeniden adlandırır.
$contextarrayrefservice alan adı kaydı, instance servis sağlayıcı ya da null, surface şunlardan biri: website, client_api, admin_panel, admin_api.
Dönüş 1
voidMatris referansla değişir; dönüş okunmaz.
Dinleyici
Hook::add('filter:domain.capabilities', 10, function (&$caps, $context = []) {
    $service = $context['service'] ?? [];
    if (!MyDns::handles((int) ($service['id'] ?? 0))) return;

    $caps['dns_records'] = true;
    $caps['dns_edit']    = true;
});

Çağrıyı karşılamak

filterdomain.capability_provider
Services::instance_module() referansla

Bir ekran modül örneğini isterken ve kullanacağı yeteneğin adını bildirirken çalışır. Yetenek adı verilmeyen çağrı bu kancaya hiç gelmez, bu yüzden hizmet yaşam döngüsü etkilenmez.

Parametreler 2
$providerobject|falsereffalse olarak gelir. Bir nesne atarsanız çağrı ona gider; başka bir değer yok sayılır.
$contextarrayrefservice alan adı kaydı, capability istenen yetenek adı, instance servis sağlayıcı ya da null.
Dönüş 1
voidSağlayıcı referansla verilir; dönüş okunmaz.
Dinleyici
Hook::add('filter:domain.capability_provider', 10, function (&$provider, $context = []) {
    if (!in_array((string) ($context['capability'] ?? ''), ['dns_records', 'dns_edit'], true)) return;

    $service = $context['service'] ?? [];
    if (!MyDns::handles((int) ($service['id'] ?? 0))) return;

    $provider = new MyDnsProvider($service);
});

Sağlayıcı nasıl görünmeli

Sağlayıcınız servis sağlayıcının taşıyacağı metot adlarını taşır. Bunları gerçek metot olarak tanımlayın.

Sağlayıcı
class MyDnsProvider
{
    public string $error = '';

    public function set_service(int|array $service = []): void {}

    public function get_dns_records(): array|false
    {
        // ... bölgeyi oku
        return $records;
    }

    public function add_dns_record($type, $name, $value, $ttl, $priority): bool
    {
        // ... tek kaydı yaz
        return true;
    }
}

Tuzaklar

Sihirli __call() işe yaramaz. Her ekran bir şey çağırmadan önce method_exists() sorar ve __call() ile karşılanan bir metot o kontrolde görünmez. Sağlayıcınız o zaman hiç çağrılmaz ve hiçbir yer hata bildirmez. Her metodu gerçek metot olarak tanımlayın.

Tek kanca yetmez. Sağlayıcı olmadan matrisi açarsanız müşteri boş bir sekme açar. Matrisi açmadan sağlayıcı verirseniz sekme hiç görünmez.

Dört ekran, tek cevap. Matris her ekranda ayrı hesaplanır. Panelde açılıp API'de atlanan bir yetenek, sekme görünürken ucun isteği reddetmesi olarak okunur.

Yaşam döngüsü sizin değil. Yetenek devri yalnız o yeteneği kapsar. Oluşturma, yenileme, transfer ve iptal servis sağlayıcıya gitmeye devam eder; bunu güvenli kılan da budur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.