Kanca Dinleyicisi Yazma
Bir kancaya bağlanan işlevi yazmak: parametreleri doğru sırayla almak, dönüşü sözleşmesine göre vermek.
Genel Bakış
Dinleyici üç şeydir: bağlandığınız ad, sıradaki yeriniz olan sayı, çalışacak işlev. Zor kısım bunlar değil. Zor olan işlevin imzasını ve dönüşünü doğru yazmaktır.
Her kanca kendi sözleşmesini taşır. Biri değeri referansla verir ve değiştirmenizi bekler. Biri döndürdüğünüz metni ekranda gösterir. Biri o metni hata olarak fırlatıp işlemi durdurur. Biri dönüşünüze hiç bakmaz.
Sözleşmeyi yanlış okumak hata vermez: dinleyici çalışır, hiçbir şey olmaz.
Ön Koşullar
- Kancalar Nasıl Çalışır okunmuş olmalı.
- Bağlanacağınız kancanın adı ve kaydı. Parametrelerin anlamı orada yazar.
- Dinleyicinin yaşayacağı dosya:
coremio/hooksaltında bir dosya ya da modülünüzünhooks.phpdosyası.
Adım Adım
1. Sözleşmeyi okuyun
- Kancanın kaydında üç satır vardır: Mekanizma, Parametreler, Dönüş sözleşmesi. Üçünü de okuyun.
- Adın önündeki sözcüğe göre karar vermeyin. Ölçüldüğünde
filterailesinin bir bölümü kopyayla çağrılıyordu. - Parametre listesindeki Ref sütunu belirleyicidir. İşaretli parametreyi
&ile alırsanız değiştirebilirsiniz.
2. İmzayı yazın
- Parametreleri kancanın verdiği sırayla alın. Adları serbesttir, sıra değildir.
- Sondaki gereksiz parametreleri yazmayın. Eksik yazmak güvenli, fazla yazmak dinleyiciyi düşürür.
- Değiştireceğiniz parametreyi
&ile alın.
// filter:invoice.late_fee_amount — kayittaki sira: &$fee, $invoice, $cycle
Hook::add('filter:invoice.late_fee_amount', 10, function (&$fee, $invoice) {
if ((int) ($invoice['user_id'] ?? 0) === 1) $fee = 0.0; // ucuncu parametre yazilmadi
});
3. Dönüşü verin
- Kaydın Dönüş sözleşmesi satırı ne diyorsa onu yapın. Aşağıdaki dağılım yardımcıdır, karar o satırındır.
- Dokunmak istemiyorsanız
nulldönün. - Bir işlemi durduruyorsanız kullanıcının okuyacağı cümleyi dönün.
4. Çalıştığını kanıtlayın
- Dosyayı yerine koyun, kancayı tetikleyen işi yapın. Yeniden başlatma gerekmez.
- Hiçbir şey olmadıysa hata günlüğüne bakın.
Hook execution errorkaydı dinleyicinin koşup patladığını söyler. Hook listener unresolvedkaydı ise sınıf ya da metot adının yanlış olduğunu söyler.- Günlük boşsa dinleyici hiç çağrılmamıştır: ad yanlıştır ya da dosya taranan iki yerde değildir.
- Kesin cevap için kancayı teşhis kipinde çalıştırın.
foreach (Hook::runDetailed('action:service.created', $id, $data) as $row) {
echo $row['source']['file'] . ':' . $row['source']['line'] . "\n";
if ($row['error'] !== null) echo ' HATA: ' . $row['error'] . "\n";
}
Referans
Aşağıdaki dağılım 1007 kancanın kaydından sayıldı. Bir ailede neyi beklemeniz gerektiğini gösterir. Tek bir kanca için doğruluk kaynağı değildir: her satırda başka türlü davranan bir azınlık var.
null ya da boş string akışı sürdürür.
Sıra numarası
Küçük sayı önce çalışır. Aynı sayı iki kez alınamaz: ikinci dinleyici bir sonraki boş sayıya kaydırılır.
Sayıyı diğer dinleyicilere göre seçin. Bir değeri son sözü siz söyleyerek değiştirmek istiyorsanız büyük sayı verin. Bir işlemi herkesten önce durdurmak istiyorsanız küçük sayı verin.
Örnek
Bir kurulumun kurumsal müşteri kuralları: gecikme ücreti alınmaz, hizmet açılışı dış bir sisteme bildirilir, borçlu hesabın hizmeti silinemez.
<?php
// DEGER: gecikme ucretini referansla sifirla.
Hook::add('filter:invoice.late_fee_amount', 10, function (&$fee, $invoice) {
if (Corporate::has((int) ($invoice['user_id'] ?? 0))) $fee = 0.0;
});
// OLAY: hizmet acildi. Donusumuze bakilmaz.
Hook::add('action:service.created', 10, function ($id, $data) {
if (Corporate::has((int) ($data['owner_id'] ?? 0))) Crm::openedService($id, $data);
});
// IZIN: bos olmayan string silmeyi durdurur; bu cumle operatore gosterilir.
Hook::add('gate:service.delete', 10, function ($service) {
$uid = (int) ($service['owner_id'] ?? 0);
if (Corporate::has($uid) && Corporate::owes($uid))
return 'Odenmemis faturasi olan kurumsal hesabin hizmeti silinemez.';
return null;
});
Üçü aynı dosyada durur ve üçü farklı sözleşmeye uyar: biri parametresini değiştirir, biri hiçbir şey döndürmez, biri metin döndürüp işlemi keser.
Tuzaklar
İmzada &$deger yazmak tek başına yetmez; değerin referansla gönderilmiş olması gerekir. Kayıt o parametreyi referanslı göstermiyorsa değişikliğiniz yerel kopyada kalır. Belirti yoktur: hata çıkmaz, yalnız etki olmaz.
Bir kancayı referanslı biçimde siz açıyorsanız, geçtiğiniz her argüman değişken olmalıdır. Dizi sabiti, metin sabiti, fonksiyon dönüşü ya da ?? ifadesi geçmek ölümcül hatadır ve sayfayı düşürür. Bağlam değerlerini önce değişkene alın.
Dinleyiciyi sınıf metodu olarak kaydettiğinizde o sınıf bir kez kurulur. Aynı sınıfı kullanan bütün kancalar aynı nesneyi paylaşır. Kurucudaki iş kanca başına değil istek başına bir kez olur; nesnede tuttuğunuz durum diğer kancalara taşınır. İstemiyorsanız statik biçimi kullanın.
Aynı sayıyı iki dinleyiciye vermek onları eşit yapmaz; ikincisi bir sonraki boş sayıya kaydırılır. Hangisinin kaydığı dosyaların yüklenme sırasına bağlıdır ve modül eklendikçe değişebilir. Sırası önemli olan dinleyicilere ayrı sayılar verin.
Engelleme kancaları her denemede çalışır ve tek işleri olur ya da olmaz demektir. İçinde uzak servise istek atmak veya veri yazmak akışı yavaşlatır. Dahası, başka bir dinleyici işlemi zaten durdurmuş olabilir; yazdığınız kayıt karşılığı olmayan bir kayıt olarak kalır.
İ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.