erebox / flightphp-wire
Convenzioni di progetto su FlightPHP: bootstrap, controller base, routing via attributi, generatore OpenAPI.
0.0.5
2026-10-11 10:42 UTC
Requires
- php: >=7.4
- flightphp/core: ^3.0
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Convenzioni di progetto condivise fra i siti basati su FlightPHP:
core\Bootstrapinizializza l'engine Flight (path dei controller, config dadata/config.json, censimento controller, registrazione route).core\controllers\BaseController/BaseWebController/BaseApiControllersono le classi base da cui estendere i controller del sito; il tipo di classe base determina la classificazione automatica (web vs API).core\attributes\Routeè l'attributo PHP con cui annotare i metodi dei controller per dichiarare path, verbo HTTP, middleware e metadati OpenAPI.core\helpers\ControllerScanner,AttributeRouteRegistrareOpenApiGeneratorgestiscono rispettivamente il censimento dei controller, la registrazione delle route e la generazione dello spec OpenAPI.core\helpers\Sessionè registrata come servizio Flightsession(istanza unica e lazy:$this->session()nei controller). Legge la sessione senza tenerne il lock (read_and_close), non la avvia se il browser non ha il cookie e scrive solo concommit();regenerate()rigenera l'id al commit (da usare dopo il login). Opzioni di default: cookieSESS_ID,HttpOnly,SameSite=Lax,Securese in HTTPS.- La config del sito (
data/config.json) viene sovrapposta con merge ricorsivo a quella di default della libreria (src/config/default.json): il sito scrive solo i propri valori (BASEURL,APIKEYS,API_INFO.title/description/contactEmail, credenzialiOAUTHS.CFG.<Provider>.clientID/clientSecret, ...) e può sovrascrivere qualunque default. I default comprendonoAPI_INFO(titolo, descrizione e versione generici;securitySchemes/defaultSecurityvanno dichiarati dal sito) e gli endpoint dei provider OAuth (Google, Github, Gitlab, Yahoo, Microsoft, Facebook, Dropbox, Erebox); un provider è attivo solo se il sito ne impostaclientIDeclientSecret. core\controllers\BaseOAuthControllerfornisce il login OAuth2: il controller del sito che la estende eredita le routeGET /auth/@provider(avvia il login: genera lostateanti-CSRF, lo salva in sessione e reindirizza al provider) eGET|POST /auth(callback: verifica lostate, scambia il code con il token e legge il profilo), e implementa soloonOAuthLogin($provider, $user)($user=email,name,avatar,raw). Opzionali:onOAuthError(),oauthReturnPath(),oauthRedirectUri(),oauthProviders(). I provider sono letti da configOAUTHS.CFG.<Provider>(clientID,clientSecret,urlAuthcon i segnaposto{clientID}/{redirectUri},urlAccessToken,urlUserInfo); il redirect URI da registrare presso i provider è<schema>://<host><basePath>/auth. La logica verso i provider è incore\helpers\OAuth.- Percorso base: il sito può stare alla radice del dominio o in una sottocartella.
Bootstrap::initricava la sottocartella dalla posizione diindex.php(o dalla chiaveBASEPATHdella config, es. dietro un proxy) e la espone comebasePath(''alla radice,'/sottocartella'altrimenti) ewebPath(basePath+/): nei controller$this->basePath,$this->webPathe$this->webUrl('/percorso')(=basePath+/percorso), nelle viste la variabile$basePath(già sanificata). I redirect ricevono il percorso completo ($this->redirect($this->webUrl('/pagina'))): il prefisso automatico di Flight (flight.base_url) è disattivato per non aggiungere la sottocartella due volte. Il routing non cambia: le route si dichiarano sempre dalla radice del sito (/pagina). core\middlewares\WebHeadereValidateApikeysono i middleware di default applicati rispettivamente alle route web e API.BaseWebController::renderPageLinks($title, $controllerClass = null)renderizza una pagina con i link alle pagine del controller (di default quello corrente);pageLinks($controllerClass)restituisce lo stesso elenco come array. Sono incluse solo le routeGETsenza parametri di path e non marcatehidden; l'etichetta è ilsummarydella route (o il path). La vistalinks.htmlè quella del sito se presente inapp/views, altrimenti quella di default della libreria.core\controllers\DefaultRouteControllerfornisce le route di default:/(homepage),/api(Swagger UI) e/api/openapi(spec generata).Bootstrap::initle registra sempre, ma salta quelle il cui path+metodo è già dichiarato da un controller del sito: un sito può quindi sovrascrivere una singola route (es. solo/) senza perdere le altre. Le visteindex.html/swagger.htmlsono quelle del sito se presenti inapp/views, altrimenti vengono usate quelle di default incluse nella libreria (src/views).core\helpers\ErrorPages(registrata daBootstrap::init) sostituisce le risposte di default di Flight per 404 (route inesistente), 405 (metodo non ammesso, con headerAllow) e 500 (eccezione non gestita, sempre scritta conerror_log; il messaggio è mostrato solo conflight.debugattivo). Sotto/apirisponde in JSON ({"error": "..."}), altrove renderizza la vistaerror.htmldel sito se presente inapp/views, altrimenti quella di default della libreria; la vista riceve$code,$title,$message,$detail,$path. Le chiamate esplicite ahalt()nei controller non passano di qui.
Installazione
composer require erebox/flightphp-wire
Uso
Nel file iniziale del sito (es. index.php):
require 'vendor/autoload.php'; use core\Bootstrap; $app = Bootstrap::init(__DIR__.'/app', 'app\\controllers'); $app->start();
Bootstrap::init si aspetta la convenzione comune ai siti: controller in app/controllers (che estendono BaseWebController/BaseApiController), route dichiarate con l'attributo Route, config in data/config.json.