Estensibilità
In alcuni casi, potresti aver bisogno di altre estensioni per estendere la tua estensione.
Backend
Le estensioni estendono il backend di Flarum Core tramite due meccanismi:
Non a caso, puoi rendere estensibile la tua estensione tramite gli stessi meccanismi.
Eventi personalizzati
Per conoscere gli eventi di dispatching e definirne di nuovi, consultare la documentazione pertinente.
Extenders Personalizzati
Diciamo che hai sviluppato un'estensione che aggiunge un driver di ricerca alternativo a Flarum, ma vuoi consentire ad altre estensioni di aggiungere il supporto per filtri personalizzati/ordinamento. Un estensore personalizzato potrebbe essere un la via giusta da seguire.
L'implementazione degli extender è in realtà abbastanza semplice. Queste sono le 3 fasi principali:
- Vari metodi (e il costruttore) consentono al codice client di specificare le opzioni. Per esempio:
- Quale modello/controller API/validatore dovrebbe essere esteso?
- Quali modifiche si dovrebbero apportare?
- Un metodo
extend
prende l'input dal passaggio 1, e lo applica modificando varie container bindings e variabili statiche globali per ottenere l'effetto desiderato. Questa è la "implementazione" del composer. I metodiextend
per tutte le estensioni abilitate vengono eseguiti come parte del processo di avvio di Flarum. - Facoltativamente, gli extender che implementano
Flarum\Extend\LifecycleInterface
possono avere i metodionEnable
eonDisable
, che vengono eseguiti quando le estensioni che usano l'extender sono abilitate/disabilitate, e sono utili per attività come la cancellazione di varie cache.
Di conseguenza, per creare un estensore personalizzato, tutto ciò che devi fare è:
- Definire una classe che implementa
Flarum\Extend\ExtenderInterface
. - Definire argomenti nel costruttore, e vari metodi. Tali metodi dovrebbero rappresentare "modifiche" concrete.
- Implementa un metodo
extend
che modifica l'estensione (o Flarum), tipicamente estendendo/modificando i binding del container. - Facoltativamente, implementa
Flarum\Extend\LifecycleInterface
se è necessaria una pulizia su enable/disable.
Before designing your own extenders, we HIGHLY recommend looking through the implementations of core's extenders.
Gli estensori personalizzati introdotti dalla tua estensione dovrebbero essere considerati API pubbliche. È possibile aggiungere test automatici tramite il nostro pacchetto di test backend.
:::cautela
Gli estensori personalizzati NON devono essere usati per eseguire logiche arbitrarie durante il processo di avvio di Flarum. Questo è un lavoro per il Service Providers. Un modo semplice per controllare: se stai usando gli estensori che hai definito nella tua estensione, probabilmente stai facendo qualcosa di sbagliato.
:::
Frontend
Se vuoi che altre estensioni siano in grado di utilizzare classi o funzioni definite nella tua estensione (riutilizzare o modificare tramite gli utils extend/override), dovrai esportarli nell'indice di index.js
(tipicamente lo stesso luogo in cui si trova il tag initializer della tua estensione).
Per esempio:
app.initializers.add('your-extension-id', () => {
// Il codice della tua estensione andrà qui
})
export {
// Tutto ciò che vuoi esportare invece andrà qui.
}