İşin aslı laravelin facadesi facade değil.Bu ayrıntıyı bilin.Pattern olarak facade başka bir şeydir.Laravelin facadesi.Containere kaydedilmiş bir nesneye yalancı bir static çağırımla ulaşma yöntemine facade diyor.(Bu taylorun magic hastalığından kaynaklanan bir şey gibi duruyor bana göre

) Aslına bakarsan laravelin facadesi resmen proxydir.
Ornek vermek gerekirse ;
app()->instance('foo',new foo());
bu kod laravelin container sistemine foo adında bir abstract ifadeyi new foo() ile concrete bir obje atayarak saklar.
siz buna ;
app()['foo'];
diyerek ulasabilirsiniz...
Yazabileceğin bir facade sundan ibarettir...
class Foo extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'foo';
}
}
aslında zırnık faydası yok sana...Annotations tanımlaman lazım ki foo nesnesinin methodlarını ide ipucu olarak hatırlatsın sana...
Mesela auth facadesi için tanımlanana annotationlara burada bakabilirsin...
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Facades/Auth.php
Yani laravelin facadelerini tanımlı annotationlarla iyi kullanabilirsin..
Ornegin senin foo objende 20 tane method olsun...
public function x1(){}
public function x2(){}
public function x3(){}
Laravelde tanımladıgın bir foo facadesi için..
Foo::x1();
şeklinde kullanman gerek..Ama ide hatırlatmaz sana annotation yazmadıgın surece..
Methodları bilmek zorundasın. bu yontem de benim asla hoşuma giden bir şey değil.Laravel cok magiclerle oynuyor o yüzden rahat kullanımı bazen yok ediyor...
Şöyle iki kod;
app('foo')->x1();
Foo::x1();
Mota mot aynı ikiside.Hic bir fark yok.O zaman facadeye ne ihtiyac var bilmiyorum

extradan ikincisi için sınıf yapmak zorundasın ayrıca.
Velhasıl;
https://cangelis.com/laravel-facade-olmayan-facadelar/
can gelişin su yazısını okuyun...
Ha şu var ; mantığı kavramak için
Foo::x1();
ile nasıl ulasım saglıyorsun.Facade çocuk sınıfı temelde bir accessordan ibaret.Aslında işi yapan
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Facades/Facade.php
su sınıf; php temel kullanımda x1() methodu burada yer almadıgı için direkt olarak sen aslında static __call methoduna yönlendiriliyorsun...
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Facades/Facade.php#L229
bu linkte işaretlediğim yer...burayı takip ederek sahte çağırımla accessor aracılığı ile container nesnesine nasıl ulaştığını takip edebilirsiniz...
Tekrar söylemekte fayda var ki ; Laravelin facadeleri ancak container nesnesine kaydedilmiş değerler için geçerlidir.Kafanıza göre bir facade yazayım bir yerlere ulaşayım diye bir şey yok..
Eğer nesne container da mevcut değilse
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Facades/Facade.php#L128
buradaki swap methodu ile cocuk sınıfta atama yaparsınız..
Ornegini date sınıfında görüyoruz..
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Facades/Date.php#L105
Son olarak şu bilgiyi de vereyim..Laravel facade sınıfında işi yapan sınıfta static::$app diye bir kullanım vardır.
Aslında bu daha once
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Facades/Facade.php#L215
buradaki setFacadeApplication methodu ile atanmıştır.Peki nerde..
Laravelin yaşam çemberini bilirseniz.Bu aslında laravelin başlangıç processlerinde bulununan boot yöntemlerinde gelir..
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Foundation/Bootstrap/RegisterFacades.php#L22
oda burada...
İyi calısmalar..