Provider di servizi
Come notato in questa documentazione, Flarum utilizza il contenitore dei servizi Laravel (o IoC container) per l'iniezione di dipendenze. I provider di servizi consentono la configurazione e la modifica del backend Flarum a basso livello. Il caso d'uso più comune per i provider di servizi è creare, modificare o sostituire i binding del contenitore. Detto questo, i provider di servizi consentono l'accesso completo per eseguire qualsiasi logica necessaria durante l'avvio dell'applicazione con accesso al contenitore.
A differenza di altri estensori, il livello del provider di servizi NON è basato sul caso d'uso e NON è considerato API pubblica. È soggetto a modifiche in qualsiasi momento, senza preavviso. E dovrebbe essere usato solo se sai cosa stai facendo e gli altri extender non soddisfano il tuo caso d'uso.
Processi di Boot di Flarum
Per comprendere i provider di servizi, devi prima capire l'ordine in cui Flarum si avvia. Most of this happens in Flarum\Foundation\InstalledSite
- Il contenitore e l'applicazione vengono inizializzati e vengono registrati i collegamenti essenziali (configurazione, ambiente, logger)
- Il metodo
register
di tutti i principali provider di servizi viene eseguito. - Il metodo
extend
di tutti gli extender utilizzati dalle estensioni sono avviati. - Il metodo
extend
di tutti gli extender utilizzati nel file Flarumextend.php
è avviato. - Il metodo
boot
di tutti i provider di servizi principali è avviato.
Provider di servizi personalizzato
Un provider di servizi personalizzato dovrebbe estendersi in Flarum\Foundation\AbstractServiceProvider
, e può avere metodi boot
e register
. Per esempio:
<?php
use Flarum\Foundation\AbstractServiceProvider;
use Illuminate\Contracts\Container\Container;
class CustomServiceProvider extends AbstractServiceProvider
{
public function register()
{
// custom logic here, for example:
$this->container->resolving(SomeClass::class, function ($container) {
return new SomeClass($container->make('some.binding'));
});
}
public function boot(Container $container)
{
// custom logic here
}
}
Il metodo register
verrà eseguito durante il passaggio (3) qui sopra, e il metodo boot
verrà eseguito durante la fase (5). In entrambi i metodi, il contenitore è disponibile tramite $this->app
. In the boot
method, the container (or any other arguments), should be injected via typehinted method arguments.
Flarum does not currently support Laravel Octane, but some best practices, like using the $container
argument inside bind
, singleton
, and resolving
callbacks instead of $this->container
should be used. See the Octane documentation for more information.
Per registrare effettivamente il tuo provider di servizi personalizzato, puoi utilizzare l'extender ServiceProvider
in extend.php
:
<?php
use Flarum\Extend;
return [
// Other extenders
(new Extend\ServiceProvider())
->register(CustomServiceProvider::class),
// Other extenders
];