nuri60 Kabaca anlatmak gerekirse, verdiğim ActiveId örneğinden yola çıkarak, ActiveId::setId(5)
yaptığınızda, yeni bir ActiveId örneği (instance) oluşturmadığınız için, veriyi ActiveId sınıfı üzerinde saklamış oluyorsunuz. O yüzden istek içerisinde sonradan ileride bir yerde ActiveId::getId()
şeklinde erişebiliyorsunuz ama new ActiveId
yaptığınızda yeni bir ActiveId örneği oluşturmuş oluyorsunuz. Onu daha sonra kullanabilmeniz için bir değişkene aktarmanız lazım ve o değişken üzerinden işlem yapmanız lazım, o değişkeni katmanlar arasında taşımanız lazım.
Laravel kullandığımız için burada service container özelliklerinden faydalanarak aslında static kullanmadan da bu obje devamlılığını sağlayabiliriz. Sınıfın şöyle, static yöntemler kullanmadığını düşünün:
class ActiveId
{
private ?int $id = null;
public function setId(int $id): void
{
$this->id = $id;
}
public function getId(): ?int
{
return $this->id;
}
}
Bunun için AppServiceProvider::register() yöntemi içinde bir tane singleton tanımlaması yapacağız:
$this->app->singleton(ActiveId::class, function ($app) {
return new ActiveId;
});
Bu tanımlama ile ActiveId sınıfını Laravel'in service container'ına dahil etmiş olduk ve singleton olduğu için istek içerisinde devamlılığı olan bir obje oluşturmuş olduk (bind ile singleton arasındaki fark da budur. bind yapsaydık kullandığımız her yerde yeni bir instance oluşacaktı). Bunu dediğim gibi kullanabilmek için ya bir yönteme enjekte etmemiz gerekiyor ya da resolve() yöntemi ile çağırmamız gerekiyor. Mesela bir middleware içerisinde resolve(ActiveId::class)->setId(5);
yaparsanız örneğin bu middleware dahilindeki bir rotanın çağırdı controller yöntemi içerisinde
public function index(ActiveId $activeId)
{
$id = $activeId->getId(): // 5
//...
}
şeklinde 5 değerine ulaşabiliriz çünkü burada enjekte edilen ActiveId sınıfı aslında middleware içerisinde yüklenen ActiveId sınıfının ta kendisi. bind yapmış olsaydık yeni bir instance olduğu için getId() null dönerdi.