Leon Facade, service container dahilinde bir sınıfın yöntemlerinin statik olarak kullanılmasını sağlayan bi arayüzdür. Ayrıca ek bir katman daha oluşturarak kodda değişiklik yapmadan proxy olarak temsil edilen ana sınıfın değiştirilmesine olanak sağlayarak inversion of control ilkesinin de gerçekleşmesini sağlar. Bu bakımdan örneğin tarih işlemlerinde Carbon sınıfı yerine Illuminate\Support\Facades\Date kullanılması gerekiyor. Carbon kullandığınızda Laravel özelliğini değil PHP paketi olan Carbon'u kullanmış oluyorsunuz. Illuminate\Support\Facades\Date kullandığınızda ise Laravel'in özelliğini kullanıyorsunuz. İkisi aynı şey gibi gözükse de örneğin ileride Carbon sınıfı değişse Illuminate\Support\Facades\Date kullanırsanız Illuminate\Support\Facades\Date geçen yerleri değiştirmek zorunda kalmazsınız. Illuminate\Support\Facades\Date içinde aynı yöntemler gerçekleştirilerek farklı bir tarih kütüphanesi sisteme eklenebilir, Carbon değiştirilebilir.
Burada Facade kullanımı ile bir soru da cevaplanmış oluyor: Facade kullanabilmek için proxylenen sınıfın service container dahilinde bir sınıf olması gerekiyor.
Yapmanız gereken yazılan API, servis... her ne ise bunu service container içerisine dahil etmeniz. Bir alias vererek bağlayın:
$this->app->bind('translation.api', function() {
return new \App\Services\Translation\TranslationService();
});
Böylece direkt kullanmak istediğinizde new TranslationService() yerine resolve('translation.api') şeklinde kullanabilirsiniz. Daha sonra binding üzerinde bir değişiklik yapsanız bile kodu değiştirmenize gerek kalmaz.
Ayrıca interface kullanın ki takaslanabilir dependency injection gerçekleşebilsin ve service container ile IoC nimetlerinden faydalanabilesiniz:
$this->app->bind(
\App\Services\Translation\TranslationServiceInterface::class,
\App\Services\Translation\TranslationService::class
);
Sınıfı service container içerisine dahil ettiğinizde artık Facade kullanmak biraz tercih meselesi oluyor. Durağan olmayan yöntemlere statik ulaşmaktan fazla bir katkısı olmuyor.