Цитирование Laravel's documentation:
Есть два способа контейнера IoC разрешения зависимостей: через Закрытие обратного вызова или автоматического разрешения.
Но во-первых, что такое зависимость? В коде, который вы опубликовали, класс UserRepository
имеет одну зависимость, которая является классом Something
. Это означает, что UserRepository
будет зависеть от Something
где-то в его коде. Вместо того, чтобы использовать его непосредственно, делая что-то вроде этого
$something = new Something;
$something->doSomethingElse();
это впрыскивается в функции конструктора. Этот метод известен как dependency injection. Таким образом, эти фрагменты кода будут делать то же самое, без и с помощью инъекции зависимостей.
// Without DI
class UserRepository {
public function doSomething()
{
$something = new Something();
return $something->doSomethingElse();
}
}
Теперь, используя DI, которая была бы такой же, как вы писали:
// With DI
class UserRepository {
public function __construct(Something $something)
{
$this->something = $something;
}
public function doSomething()
{
return $this->something->doSomethingElse();
}
}
Вы говорите, что вы не понимаете, параметр передается в конструктор __constructor(Something $something)
. Эта строка говорит PHP, что конструктор ожидает один параметр, $something
, который должен быть экземпляром класса Something
. Это называется type hinting. Передача параметра, который не является экземпляром Something
(или любого подкласса), выдает исключение.
Наконец, вернемся к контейнеру IoC. Ранее мы говорили, что его функция заключается в разрешении зависимостей, и он может сделать это двумя способами.
Первый, Затворы обратные вызовы:
// This is telling Laravel that whenever we do
// App::make('user.repository'), it must return whatever
// we are returning in this function
App::bind('UserRepository', function($app)
{
return new UserRepository(new Something);
});
Второй, автоматическое разрешение
class UserRepository {
protected $something;
public function __construct(Something $something)
{
$this->something = $something;
}
}
// Now when we do this
// Laravel will be smart enough to create the constructor
// parameter for you, in this case, a new Something instance
$userRepo = App::make('UserRepository');
Это особенно полезно и позволяет вашим классам быть более гибкими, при использовании интерфейсов в качестве параметров для ваших конструкторов ,
Отличное объяснение! Я читал об этом некоторое время, пытаясь понять, как это работает. Теперь это имеет смысл ... Я все еще новичок в PHP-фреймворках, laravel - это мой первый! –
Не волнуйтесь, если все эти понятия звучат странно прямо сейчас. Они станут понятнее, когда вы получите больше опыта. Мы все там;) –
+1 для хороших объяснений. :) – itachi