Я начинаю изучать Laravel, но я не понимаю концепцию Service Container.
Как это работает и что разработчики должны знать, чтобы полностью использовать эту концепцию в Laravel?
Я начинаю изучать Laravel, но я не понимаю концепцию Service Container.
Как это работает и что разработчики должны знать, чтобы полностью использовать эту концепцию в Laravel?
Service Container в Laravel - это контейнер для инъекций зависимостей и реестр для приложения
Преимущества использования контейнера Service для создания вручную ваших объектов:
Емкость для управления зависимостями класса при создании объекта
Вы определяете, как объект должен быть создан в одной точке приложения (привязка), и каждый раз, когда вам нужно создать новый экземпляр, вы просто запрашиваете его в контейнере службы, и он создаст его для вас, вдоль с требуемыми зависимостями
Например, вместо создания объектов вручную с ключевым словом new
:
//every time we need YourClass we should pass the dependency manually
$instance = new YourClass($dependency);
вы можете зарегистрировать привязку в контейнере сервисов:
//add a binding for the class YourClass
App::bind( YourClass::class, function()
{
//do some preliminary work: create the needed dependencies
$dependency = new DepClass( config('some.value') );
//create and return the object with his dependencies
return new YourClass( $dependency );
});
и создать экземпляр через контейнер службы с помощью:
//no need to create the YourClass dependencies, the SC will do that for us!
$instance = App::make( YourClass::class );
Связывание интерфейсов с конкретными классами
При использовании автоматической активации зависимостей Laravel, когда в какой-либо части приложения (например, в конструкторе контроллера) требуется интерфейс, конкретный класс автоматически создается контейнером сервисов. Изменение конкретного класса при привязке изменит конкретные объекты, созданные через все ваше приложение:
//everityme a UserRepositoryInterface is requested, create an EloquentUserRepository
App::bind( UserRepositoryInterface::class, EloquentUserRepository::class );
//from now on, create a TestUserRepository
App::bind( UserRepositoryInterface::class, TestUserRepository::class );
Использование контейнера сервисов в качестве реестра
Вы можете создавать и хранить уникальные экземпляры объектов в контейнере и возвращать их позже: используя метод App::instance
для создания привязки и, таким образом, используя контейнер в качестве реестра.
// Create an instance.
$kevin = new User('Kevin');
// Bind it to the service container.
App::instance('the-user', $kevin);
// ...somewhere and/or in another class...
// Get back the instance
$kevin = App::make('the-user');
В качестве окончательной заметки, по существу, контейнер-контейнер - это объект Application
: он расширяет класс Container
, получая все функциональные возможности контейнера
Контейнер Laravel создает экземпляр для полного приложения из служб (класса)
Нам не нужно создавать instance
для нашего приложения, например
$myclass = new MyClass();
$mymethod = $myclass->myMethod();
App:: привязка
Сначала мы переходим к статическому методу связывания связывания класса App
. bind
просто привязывает ваш класс instance
(объект) к приложению, не более того.
App::bind('myapp', function(){
return new MyClass();
});
Теперь мы можем использовать этот объект для нашего приложения, используя make
статический метод класса App
.
$myclass = App::make(MyClass::class);
$mymethod = $myclass->myMethod();
App:: одноточечно
В приведенном выше примере, когда мы будем называть метод make
, тогда он генерирует каждый раз новый instance
класса, поэтому у Laravel есть довольно решение для Singleton
Мы можем привязать object
к нашему приложению методом Singleton
.
App::singleton(MyClass::class, function(){
return new MyClass();
});
Мы можем решить метод make
. Теперь мы всегда получали тот же самый экземпляр из этого метода.
$myclass = App::make(MyClass::class);
$mymethod = $myclass->myMethod();
App:: экземпляр
Мы можем привязать экземпляр к контейнеру, и мы всегда будем возвращать тот же самый экземпляр, используя метод instance
.
$myclass = new MyClass();
App::instance(MyClass::class, $myclass);
Мы можем быть решены с помощью
$myclass = App::make(MyClass::class);
Мы можем связывать интерфейс
App::instance(MyClassInterface::class, new MyClass);
Связывание с реализацией
Yaa, У нас есть вопрос: как мы можем реализовать привязку в нашем приложении? Мы можем реализовать привязку в нашем AppServiceProvider
app/Providers/AppServiceProvider.php
namespace App\Providers;
use App\SocialProvider;
use App\TwitterSocialProvider;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->bind(
MyClassInterface::class,
MyClass::class
);
}
}
Заключение. Сервисный контейнер помогает создать объект класса или услуги.