Ricerca…
Associazione di un'interfaccia all'implementazione
In un metodo di register
Service Provider possiamo associare un'interfaccia a un'implementazione:
public function register()
{
App::bind( UserRepositoryInterface::class, EloquentUserRepository::class );
}
D'ora in poi, ogni volta che l'applicazione avrà bisogno di un'istanza di UserRepositoryInterface
, Laravel eseguirà automaticamente l'iniezione di una nuova istanza di EloquentUserRepository
:
//this will get back an instance of EloquentUserRepository
$repo = App::make( UserRepositoryInterface:class );
Associazione di un'istanza
Possiamo utilizzare il contenitore di servizi come registro associando un'istanza di un oggetto e recuperandolo quando ne avremo bisogno:
// Create an instance.
$john = new User('John');
// Bind it to the service container.
App::instance('the-user', $john);
// ...somewhere and/or in another class...
// Get back the instance
$john = App::make('the-user');
Associazione di un Singleton al contenitore di servizi
Possiamo legare una classe come Singleton:
public function register()
{
App::singleton('my-database', function()
{
return new Database();
});
}
In questo modo, la prima volta che un'istanza di 'my-database'
verrà richiesta al contenitore del servizio, verrà creata una nuova istanza. Tutte le successive richieste di questa classe recupereranno la prima istanza creata:
//a new instance of Database is created
$db = App::make('my-database');
//the same instance created before is returned
$anotherDb = App::make('my-database');
introduzione
Il contenitore del servizio è l'oggetto principale dell'applicazione. Può essere utilizzato come contenitore di iniezione delle dipendenze e un registro per l'applicazione definendo i binding nei provider di servizi
I Service Provider sono classi in cui definiamo il modo in cui le nostre classi di servizio verranno create attraverso l'applicazione, riavviaranno la loro configurazione e collegheranno le interfacce alle implementazioni
I servizi sono classi che racchiudono una o più attività correlate alla logica
Utilizzo del contenitore di servizi come contenitore di iniezione delle dipendenze
Possiamo utilizzare il contenitore di servizi come contenitore di iniezione delle dipendenze legando il processo di creazione degli oggetti con le loro dipendenze in un punto dell'applicazione
Supponiamo che la creazione di un PdfCreator
bisogno di due oggetti come dipendenze; ogni volta che abbiamo bisogno di costruire un'istanza di PdfCreator
, dovremmo passare queste dipendenze a che costruttore. Utilizzando il Service Container come DIC, definiamo la creazione di PdfCreator
nella definizione del binding, prendendo la dipendenza richiesta direttamente dal contenitore del servizio:
App:bind('pdf-creator', function($app) {
// Get the needed dependencies from the service container.
$pdfRender = $app->make('pdf-render');
$templateManager = $app->make('template-manager');
// Create the instance passing the needed dependencies.
return new PdfCreator( $pdfRender, $templateManager );
});
Quindi, in ogni punto della nostra app, per ottenere un nuovo PdfCreator
, possiamo semplicemente fare:
$pdfCreator = App::make('pdf-creator');
E il contenitore del Servizio creerà una nuova istanza, insieme alle dipendenze necessarie per noi.