DEV Community

Cover image for Laravel'de Real-Time Facades Nedir? Nasıl Çalışır?
Barış Bideratan
Barış Bideratan

Posted on

Laravel'de Real-Time Facades Nedir? Nasıl Çalışır?

Laravel, servis container yapısıyla dependency injection (bağımlılık enjeksiyonu) kullanımını kolaylaştırır. Ancak bazı durumlarda her servisi container üzerinden almak ya da özel bir Facade sınıfı oluşturmak gereksiz gelebilir. İşte Real-Time Facades bu noktada devreye giriyor.

Kısaca özetlemek gerekirse:

Real-Time Facades, herhangi bir sınıfı veya interface'i, özel bir Facade sınıfı yazmadan Facade gibi kullanmanı sağlar.


Facade Nedir?

Laravel’de Facade, container içindeki bir servise statik gibi görünen bir arabirim sunar.
Örneğin Cache::get() ya da Log::info() çağrıları aslında arka planda container içinden çözümlenir.

Ama her Facade için ayrı bir sınıf yazmak gerekir.
Örneğin App\Facades\MyService gibi.
Real-Time Facades ise bu işi senin yerine yapar.


Normal Kullanım vs Real-Time Facade

Önce klasik bir örnek üzerinden gidelim.

Klasik yöntem:

namespace App\Models;

use App\Services\Publisher;
use Illuminate\Database\Eloquent\Model;

class Podcast extends Model
{
    public function publish(Publisher $publisher)
    {
        $this->update(['published_at' => now()]);

        $publisher->publish($this);
    }
}
Enter fullscreen mode Exit fullscreen mode

Burada Publisher sınıfını method parametresi olarak alıyoruz.
Gayet güzel ama her çağrıda bu parametreyi geçirmek gerekiyor.


Real-Time Facade ile:

namespace App\Models;

use Facades\App\Services\Publisher;
use Illuminate\Database\Eloquent\Model;

class Podcast extends Model
{
    public function publish()
    {
        $this->update(['published_at' => now()]);

        Publisher::publish($this);
    }
}
Enter fullscreen mode Exit fullscreen mode

Bak farkı fark ettin mi?

  • Artık Publisher servisini parametre olarak geçmedik.
  • use Facades\App\Services\Publisher; yazarak Laravel’e “bu sınıfı facade gibi kullan” dedik.
  • Yani Publisher::publish() dediğimizde Laravel container’dan otomatik olarak App\Services\Publisher örneğini çözüp metodu çalıştırıyor.

Gerçekten “Statik” mi Çalışıyor?

Hayır.
Publisher::publish() statik gibi görünse de aslında container’dan dinamik olarak çözülüyor.
Bu sayede test ederken mock oluşturabiliyorsun:

Publisher::shouldReceive('publish')
    ->once()
    ->with($podcast);
Enter fullscreen mode Exit fullscreen mode

Yani hem facade rahatlığını hem test edilebilirliği koruyorsun.


Gerçek Hayattan Bir Örnek

Diyelim ki bir Notifier servisin var:

namespace App\Services;

class Notifier
{
    public function sendEmail($to, $subject)
    {
        // E-posta gönderme işlemi
    }
}
Enter fullscreen mode Exit fullscreen mode

Klasik kullanım:

$notifier = app(\App\Services\Notifier::class);
$notifier->sendEmail('test@example.com', 'Merhaba!');
Enter fullscreen mode Exit fullscreen mode

Real-Time Facade ile:

use Facades\App\Services\Notifier;

Notifier::sendEmail('test@example.com', 'Merhaba!');
Enter fullscreen mode Exit fullscreen mode

Tek satırla aynı işi yaptık.
Kod hem okunabilir hem sade.


Ne Zaman Kullanmalı?

Real-Time Facades harika bir kolaylık ama her yerde kullanmak doğru değil.

Kullan:
✅ Basit servis çağrılarında
✅ Model içindeki küçük yardımcı işlemlerde
✅ Hızlı prototip geliştirme aşamalarında

Kullanma:
❌ Büyük veya karmaşık servislerde
❌ Kodun bağımlılıklarını açık görmek istiyorsan
❌ Fazla mock işlemiyle test yazıyorsan

Kısacası, tıpkı kahve gibi:
Azı lezzet, fazlası çarpıntı. ☕


Özet

  • use Facades\ ile başlayan bir import yaptığında Laravel otomatik olarak Real-Time Facade oluşturur.
  • Arka planda container çözümlemesi yapılır, yani dependency injection hâlâ geçerlidir.
  • Testlerde shouldReceive() kullanarak mock oluşturabilirsin.
  • Kodun sadeleşir ama “nereden geliyor bu servis?” sorusu bazen bulanıklaşabilir.

Top comments (0)