Merhaba,
Laravel konteynırının oldukça güçlü olduğunu biliyoruz. Service Provider ile hizmetleri bağladığımız sınıflarımıza bağımlıklıklarıda enjekte ediyoruz, ancak her bir enjekte yeni bir instance oluşturuyor.
Örneğin Laravel'ın FileSystem sınıfını kullanmak istediğimizde,
$this->app->bind('modules', function($app){
return new Modules($app['files']);
});
##Modules.php
use Illuminate\Filesystem\Filesystem;
public function __construct(Filesystem $files){} //Yeni bir sınıf olgusunu inşa ediyor.
Oysa Laravel, Filesystem sınıfını kayda geçirirken, takma ad yerine namespace kullansaydı sınıf yeniden inşaa edilmeyecek ve Container bunu çözümleyecekti.Hani bazen yeni bir sınıf olgusuna ihtiyacımız olabilir ama Filesystem'de bu gereksiz.
Bu sadece Laravel için geçerli değil, bir çok uygulamada takma ad kullanıldığını görüyorum.
orjinali;
$this->app->bindShared('files', function() { return new Filesystem; });
aslında olması gereken:
$this->app->bindShared('Illuminate\Filesystem\Filesystem', function() { return new Filesystem; });
Aristona'nın paylaştığı makalede aslında konu daha iyi anlaşılıyor. Tabi burada revolse ile takma ad yakalanıyor ama Laravel otomatik çözümleyebiliyorken, takma ad kullanmak mantıklı gelmiyor.
<?php
$container = new DependencyInjectionContainer;
$container->bind('MailerInterface', function() {
return new MandrillMailer; //Artık burayı değiştirmemiz yeterli olacak.
});
// Yeni bir MandrillMailer instancesi
$deneme = new Deneme($container->resolve('MailerInterface'));
// Yeni bir MandrillMailer instancesi
$deneme2 = new Deneme($container->resolve('MailerInterface'));
// Yeni bir MandrillMailer instancesi
$deneme3 = new Deneme($container->resolve('MailerInterface'));
...