İlk Değişikliğiniz
Platformun sahibi olduğu tek bir dosyayı düzenlemeden davranışını değiştirin: bir dinleyici kaydedin, etkisini görün, sonra aynı temizlikte geri alın.
Genel Bakış
En küçük yararlı değişiklik bir kanca dinleyicisidir. Birkaç dakikada tüm döngüyü kanıtlar: dosyanız alınır, kodunuz seçtiğiniz noktada çalışır, dönüş değeriniz dikkate alınır ve yaptığınız hiçbir şey bir güncellemeyle ezilmez.
Bu anlatım, tek kullanımlık e-posta alan adlarından gelen bülten aboneliğini engelliyor. Kuralın kendisi önemli değil; önemli olan bunun platformun asla değiştirmeyeceği bir dosyadan uygulanması.
Ön Koşullar
- Bozabileceğiniz, teşhisleri açık bir kurulum.
- Çekirdek kanca dizinine yazma yetkisi.
- Engelleyeceğiniz formu gönderen bir tema sayfası; böylece reddi görebilirsiniz.
Adım Adım
Dinleyici Dosyasını Oluşturun
coremio/hooksaltında ne yaptığını anlatan bir adla yeni bir dosya oluşturun, örneğinexample-rules.php.- O dizindeki dosyalar sizin için yüklenir; kendinizi eklemeniz gereken bir kayıt defteri yoktur.
- Şimdilik boş bırakın ve herhangi bir sayfayı yenileyin. Hiçbir şey değişmemeli; bu, dosya bir şey yapmadan önce zararsız olduğunu doğrular.
Bir Dinleyici Kaydedin
- Abonelik kaydedilmeden önce çalışan gate için bir öncelik ve bir closure ile kayıt ekleyin.
- Kancanın belgelediği parametreleri alın. Bu kanca size adresi ve dili verir.
- İzin vermek için boş dize döndürün. Bu noktada dinleyici çalışır ama hiçbir şeyi değiştirmez.
Reddetmesini Sağlayın
- Adresten alan adını okuyun ve küçük bir listeyle karşılaştırın.
- Eşleştiğinde bir mesaj döndürün. Gate'ten boş olmayan bir dönüş işlemi durdurur ve ziyaretçinin gördüğü şey o mesajdır.
- Formu eşleşen bir adresle gönderin; abonelik reddedilir ve mesajınız gösterilir. Normal bir adresle gönderin; geçer.
Geri Alın
- Dosyayı silin.
- Reddedilen adresle tekrar gönderin; artık geçiyor.
- Geri alınacak başka bir şey yok, çünkü başka hiçbir şeye dokunulmadı. İçselleştirmeye değer özellik budur.
Örnek
Hook::add('gate:client.newsletter_subscribe', 10, function ($email, $lang) {
$throwaway = ['mailinator.com', 'tempmail.com'];
$domain = strtolower((string) substr(strrchr($email, '@') ?: '', 1));
if (in_array($domain, $throwaway, true))
return Language::gc('example/permanent-address-required');
return '';
});
Bu örneğin kendi işinize kopyalamaya değer iki satırı şunlar: parametreler kancanın belgelediğiyle birebir eşleşiyor ve izin veren yol hiçbir şey değil boş dize döndürüyor.
// coremio/classes/Hook.php
public static function add($name, $priority, $properties = []): void;
public static function run($name, ...$args): array;
public static function runRefs($name, &...$args): array;
Üçüncü argüman yukarıdaki gibi bir closure alabilir ya da bir sınıf ve metot adı taşıyan bir dizi: instance çağrısı için ['class' => 'MyClass', 'method' => 'check'], statik çağrı için ['class' => 'MyClass', 'method::static' => 'check']. Düşük öncelik önce çalışır ve çakışan bir öncelik düşürülmez, kaydırılır.
Sözleşmenin diğer yarısı, dönüş değerinizin ne anlama geldiğine karar veren çekirdek tarafıdır. Bir gate her dinleyicinin cevabını toplar ve boş olmayan ilk dizenin işlemi durdurmasına izin verir.
foreach (Hook::run('gate:client.newsletter_subscribe', $email, $lang) as $veto)
if (is_string($veto) && $veto !== '') throw new Exception($veto);
$added = $this->model->add_subscriber($email, $lang);
Hiçbir şey döndürmenin tesadüfen, boş dize döndürmenin ise bilerek çalışmasının sebebi budur: null bugün dize testine takılır, açıkça yazılan boş dize ise test ileride sıkılaşsa da çalışmaya devam eder.
Tuzaklar
Dinleyici içindeki bir hata gösterilmez, yakalanıp loglanır; bu yüzden bozuk bir dinleyici hiç ateşlenmemiş bir kancadan ayırt edilemez. Önce hata günlüğüne bakın.
Doğrulama, hız sınırı ve bot koruması dinleyicinize ulaşılmadan önce olur; yani bunlardan birine takılan bir istek size hiç gelmez. Amaçlanan sıra budur ve bu, gate'in "form çalışıyor mu" testi için yanlış yer olduğu anlamına gelir.
Sabit metin yerine çeviri katmanından döndürün; yoksa kurulumunuz reddi gören herkese tek bir dilde konuşur.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.