packagist.org ↗
Kurulumcomposer require pariette/signalbird

pariette/signalbird - PHP / Laravel

Signalbird Telsiz istemcisi. Tek işi vardır: projenizden bir kanala mesaj yazmak.

Bildirimin kime gideceği, hangi kanaldan (push/e-posta), sessiz saatlerde ne olacağı panelde, kanal ayarlarında durur - kodunuzda değil.

Kurulum

bash
composer require pariette/signalbird

PHP 8.1+ ve ext-curl gerekir. Guzzle gerekmez: bir log kütüphanesinin projenize HTTP istemcisi sürümü dayatması, sürüm çakışmalarının en sık sebebidir.

Laravel'de paket kendiliğinden keşfedilir (auto-discovery).

Anahtar

Panelde Telsiz → Projeler → Yeni proje ile bir proje açın. Sunucu anahtarı (sb_secret_live_…) size bir kez gösterilir.

bash
# .env
SIGNALBIRD_DOMAIN_KEY=sb_secret_live_xxxxxxxxxxxxxxxxxxxxxxxx
SIGNALBIRD_SOURCE=api-01

İsterseniz yapılandırmayı yayınlayın:

bash
php artisan vendor:publish --tag=signalbird-config

Hızlı başlangıç

php
use Signalbird\Sdk\Facades\Signalbird;

Signalbird::critical('critical', 'ödeme servisi yanıt vermiyor', [
    'service' => 'iyzico',
]);

Signalbird::info('info', 'ahmet@x.com yeni hesap oluşturdu');

Metotlar

Metot Açıklama
log(string $channel, string $message, ?string $level = null, ?array $context = null) Temel çağrı
debug · info · warn · error · critical Seviye kısayolları
batch(array $events) En fazla 100 kayıt
identityHash(string $externalId): string Sohbet/push ziyaretçisinin kimlik doğrulama hash'i (aşağıda)

Hepsi dizi döndürür: ['ok' => true, 'event_id' => 'rev_…'] ya da ['ok' => false, 'code' => 'LIMIT_REACHED'].

Laravel loglarını Telsiz'e bağlamak

Mevcut Log::error() satırlarınız tek satır kod yazmadan Telsiz'e düşer.

config/logging.php:

php
'signalbird' => [
    'driver'  => 'monolog',
    'handler' => \Signalbird\Sdk\SignalbirdLogHandler::class,
    'with'    => ['channel' => 'laravel'],
    'level'   => 'error',
],

.env:

text
LOG_STACK=single,signalbird

Monolog seviyeleri Telsiz'in beş seviyesine eşlenir; emergency/alert gibi ayrımlar criticale toplanır.

Kayıtlar istek boyunca birikir ve sonunda tek toplu çağrıyla gider: her satır için ayrı HTTP isteği, sayfanın kendisinden uzun sürerdi. Bu yüzden leveli debuge çekmek de mümkündür - ama çerçevenin kendi gürültüsü (sorgu, cache) Telsiz kotanızı hızla yakar; üretimde info ya da warning daha doğrudur.

Laravel postasını Signalbird'den geçirmek

İki yol vardır ve ikisi de aynı uca gider. Farkları gövdenin nerede durduğudur.

Mevcut Mailable'larınız - tek satır konfigürasyon, hiçbir çağrı yeri değişmez:

php
// config/mail.php
'signalbird' => ['transport' => 'signalbird', 'class' => 'transactional'],
dotenv
MAIL_MAILER=signalbird
php
Mail::to($user)->send(new SiparisBildirimi($order));   // artık Signalbird'den

Gövdesi panelde duran gönderimler - şablon, değişken, gönderen adı:

php
Signalbird::mail()
    ->to($user->email)
    ->template('Sipariş Onayı')        // panelde yazan ad ya da id
    ->vars(['ad' => $user->name])
    ->fromName('Penyu Destek')
    ->replyTo('destek@penyu.io')
    ->transactional()                   // ZORUNLU: sınıfın varsayılanı yok
    ->send();

Metni değiştirmek için dağıtım beklemek istemiyorsanız ikincisi: şablon panelde düzenlenir, kod aynı kalır.

İki sınır: taşıyıcı e-posta eki taşımaz (sessizce düşürmez, açıkça hata verir) ve her alıcıya ayrı istek gider - Signalbird'de her alıcı ayrı bir kayıttır, toplu olan kampanyadır.

İstisna yakalayıcı

php
// bootstrap/app.php (Laravel 11)
use Signalbird\Sdk\Facades\Signalbird;

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->reportable(function (Throwable $e) {
        Signalbird::error('laravel', $e->getMessage(), [
            'exception' => get_class($e),
            'file' => $e->getFile() . ':' . $e->getLine(),
        ]);
    });
})

Kuyruk işi

php
use Signalbird\Sdk\Facades\Signalbird;

class ProcessPaymentJob implements ShouldQueue
{
    public function handle(): void
    {
        // ... ödeme işlemi
        Signalbird::info('odeme', "Sipariş #{$this->orderId} başarılı");
    }

    public function failed(Throwable $e): void
    {
        Signalbird::critical('critical', "Sipariş #{$this->orderId}: {$e->getMessage()}");
    }
}

Laravel dışı PHP

php
use Signalbird\Sdk\Signalbird;

Signalbird::configure('sb_secret_live_…');
Signalbird::error('api', 'veritabanı bağlantısı koptu');

Ya da doğrudan istemci:

php
use Signalbird\Sdk\SignalbirdClient;

$sb = new SignalbirdClient(
    domainKey: getenv('SIGNALBIRD_DOMAIN_KEY'),
    source: 'api-01',
);

$sb->warn('disk', 'disk %85 dolu');

Ziyaretçi kimliği doğrulaması - identityHash

Sohbet widget'ı ve uygulama SDK'sı oturum açmış kullanıcıyı external_id ile tanıtır. Açık anahtar sayfada durduğu için Signalbird bu kimliği ancak yanında sizin sunucunuzda üretilmiş geçerli bir hash varsa güvenilir sayar (2.7.0). Hash olmadan ziyaretçi kişi kaydına bağlanmaz, cihazı o kullanıcıya push hedefi olarak bağlanmaz ve kanal ajanının araçları kimliği yalnız visitor.unverified altında görür.

php
use Signalbird\Sdk\Facades\Signalbird;

$hash = Signalbird::identityHash((string) $user->id);   // SignalbirdClient::identityHash da aynı

Gizli anahtarı zaten tutan Telsiz istemcisinin üzerindedir; ayrı kurulum gerekmez. Algoritma (her dilde aynı çıktı):

text
identity_hash = hex( HMAC-SHA256( hex(SHA-256(sb_secret_live_…)), external_id ) )

Anahtar gizli anahtarın SHA-256 özetidir (sunucu anahtarı düz saklamaz). Kullanım: Widget - Kimlik doğrulaması, Uygulama SDK'sı.

blade
<script async src="https://signalbird.io/sdk/v1/signalbird.js"
        data-key="sb_public_live_…" data-channel="destek"
        data-external-id="{{ $user->id }}"
        data-identity-hash="{{ Signalbird::identityHash((string) $user->id) }}"></script>

Davranış kuralları

  • Sessiz hata varsayılandır. Telsiz erişilemezse ['ok' => false] döner ve uygulamanız çalışmaya devam eder. Geliştirmede SIGNALBIRD_THROW=true.
  • Tanımsız kanal düşürülmez. İlk çağrıda açılır, "otomatik açıldı" işaretiyle görünür ve sessizdir - kuralı ekip koyar.
  • Kritik seviye sessiz saatleri deler.
  • Tekrar bastırma kaydı değil bildirimi susturur.

Sürüm bildirimi

SDK her istekte sürümünü bildirir: X-Signalbird-Sdk: php/<sürüm>. Yeni bir sürüm yayınlandığında API yanıtında Signalbird-Sdk-Status: outdated (ya da artık desteklenmiyorsa unsupported) döner ve SDK süreç başına bir kez uyarı yazar (error_log). Uyarı hata değildir: isteğin sonucu değişmez.

Panelde Domainler → [domain] → Anahtarlar her anahtarın hangi SDK sürümüyle kullanıldığını gösterir; eski sürümdeki anahtarlar için panelin tepesinde bir uyarı şeridi ve bildirim çıkar. Güncellemek için:

bash
composer update pariette/signalbird

Hata kodları

Kod Anlamı
INVALID_KEY Anahtar yok, yanlış ya da proje pasif
MODULE_DISABLED Paketinizde Telsiz (logger) modülü yok
LIMIT_REACHED Aylık kayıt limitiniz doldu
CHANNEL_DISABLED Kanal kapalı - kayıt yazılmaz, kota da harcanmaz

Paketin diğer yüzeyleri

Bu sayfa Telsiz'i anlatır. Aynı paket iki yüzey daha taşır:

Yüzey Erişim Ne yapar
Gönderim Signalbird::messaging() e-posta, SMS, push; kişi, liste, kampanya; webhook imzası
Yönetim Signalbird::management() Telsiz projesi/kanalı, sohbet gelen kutusu, uygulama ve cihaz
php
use Signalbird\Sdk\Facades\Signalbird;

Signalbird::critical('critical', 'ödeme servisi öldü');                       // Telsiz
Signalbird::messaging()->sendEmail([...]);                                    // Gönderim
Signalbird::management()->createModuleKey('logger', ['name' => 'ödeme-servisi']);    // Yönetim
dotenv
SIGNALBIRD_DOMAIN_KEY=sb_secret_live_…            # Telsiz
SIGNALBIRD_DOMAIN_KEY=sb_…              # Yönetim (boşsa SIGNALBIRD_DOMAIN_KEY)
SIGNALBIRD_DOMAIN_KEY=sb_…        # Gönderim

Üç istemci de servis sağlayıcısında tekil olarak kayıtlıdır; doğrudan enjeksiyon da yapabilirsiniz:

php
public function __construct(
    private \Signalbird\Sdk\Management\ManagementClient $signalbird,
) {}

Son kullanıcı sohbeti ve push kaydı PHP'de yoktur - o yüzey istemci tarafındadır: Uygulama SDK'sı.