Poczytałem więcej różnych źródeł. Podzielę się tym do czego doszedłem, może komu się przyda. Sam temat nie jest bardzo skomplikowany ale wiele tutoriali podaje skąpy i niepełny opis. Jeżeli cokolwiek napisałem niepoprawnie proszę od razu dać znać.
Załóżmy, że mamy taki kod
namespace App;
class Foo
{
public function hello()
{
return 'Hello World';
}
}
Route::get('/foo', function (App\Foo $foo) {
return $foo->hello(); // Hello World
});
Zauważmy, że nigdzie tutaj ręcznie nie tworzymy żadnej instancji obiektu klasy App\Foo( chodzi o new App\Foo) - takowa instancja jest oczekiwana przez funkcję anonimową przekazywaną jako drugi parametr do metody get. Zatem skoro nigdzie nie ma żadnej instancji tej klasy to czy wyświetli się błąd? Nie, ponieważ Laravel sam automatycznie utworzy za nas instancję klasy App\Foo. Takie udogodnienie, które zaoszczędzi nam pisania. Automatycznie jest tworzony obiekt.
Jednakże inteligencja tego mechanizmu jest ograniczona. Załóżmy,że klasa potrzebuje nazwy naszej aplikacji np.
namespace App;
class Foo
{
public function __construct($appName)
{
$this->appName = $appName;
}
public function hello()
{
return "Hello {$this->appName}";
}
}
Z tym Laravel sam sobie nie poradzi. W konstruktorze pojawia się jakiś bliżej niezidentyfikowany parametr i nie za bardzo wiadomo co z nim zrobić. Musimy laravela nauczyć i pokazać mu jak się zachować w takiej sytuacji. Robi się to poprzez metodę bind
App::Bind(\App\Foo::class, function ($app) {
return new \App\Foo($app->config['app.name']);
});
Nazywa się to wiązaniem. Jako pierwszy parametr podajemy nazwę naszej klasy a następnie podajemy domknięcie, które będzie uruchamiane gdy zajdzie potrzeba automatycznego stworzenia obiektu. W tym domknięciu można wykonać różne czynności związane np. z konfigurowaniem czegoś w naszym obiekcie. Na koniec funkcja musi jeszcze utworzyć nowy obiekt i go zwrócić. Nie musi to być obiekt klasy którą podaliśmy jako pierwszy parametr (w tym wypadku \App\Foo), może to być obiekt innej klasy.
Pozostaje jeszcze kwestia kwestia parametru, który pojawia się w domknięciu($app). Z tego co wyczaiłem to parametr ten można nazwać dowolnie i wewnątrz naszego domknięcia można go wykorzystywać do pobierania przeróżnych informacji o aplikacji.
Można też zrobić tak
App::Bind('Bar','Baz');
Co powoduje, że gdy Laravel spróbuje automatycznie stworzyć obiekt klasy Bar to uruchomi się to co zdefiniowaliśmy w wiązaniu(jeżeli takowe istnieje) dla klasy Baz.
Chcąc stworzyć obiekt na podstawie zdefiniowanego przez nas wiązania to należy użyć
App::Make('NazwaKlasy')
O czymś zapomniałem? Coś przekręciłem?