{"id":7983,"date":"2026-08-30T12:04:11","date_gmt":"2026-08-30T10:04:11","guid":{"rendered":"https:\/\/www.italix.net\/?page_id=7983"},"modified":"2026-08-30T13:51:29","modified_gmt":"2026-08-30T11:51:29","slug":"framework-libs","status":"publish","type":"page","link":"https:\/\/www.italix.net\/el\/framework-libs\/","title":{"rendered":"Italix Framework"},"content":{"rendered":"<style>\n.italix-why-section {\n    width: 100%;\n    max-width: 100%;\n    box-sizing: border-box;\n}\n.italix-why-section h2 {\n    color: #2e2c31;\n    margin-top: 0;\n}\n.italix-why-section h3 {\n    color: #2e2c31;\n    margin-bottom: 0.4em;\n}\n.italix-why-section p {\n    line-height: 1.6;\n}\n.italix-why-section ul {\n    margin: 0 0 1.5em 0;\n    padding: 0;\n    list-style: none;\n}\n.italix-why-section ul li {\n    position: relative;\n    padding-left: 1.4em;\n    margin-bottom: 0.9em;\n    line-height: 1.6;\n}\n.italix-why-section ul li::before {\n    content: \"\";\n    position: absolute;\n    left: 0;\n    top: 0.55em;\n    width: 8px;\n    height: 8px;\n    background: #2e2c31;\n}\n.italix-why-section code {\n    background: #f1f0f2;\n    padding: 0.1em 0.4em;\n    border-radius: 3px;\n}\n.italix-why-columns {\n    display: flex;\n    align-items: flex-start;\n    gap: 2.5rem;\n}\n.italix-why-columns .italix-why-col {\n    flex: 1 1 50%;\n    min-width: 0;\n    box-sizing: border-box;\n}\n@media (max-width: 767px) {\n    .italix-why-columns {\n        flex-direction: column;\n    }\n    .italix-why-columns .italix-why-col {\n        flex: 1 1 100%;\n        width: 100%;\n    }\n}\n@media (min-width: 1600px) {\n    .italix-why-section,\n    .italix-libs-grid {\n        font-size: 22px;\n    }\n}\n<\/style>\n<div class=\"italix-why-section\">\n<p>Italix non \u00e8 un framework monolitico che installi e dentro cui vivi \u2014 \u00e8 una famiglia di librerie PHP indipendenti, ciascuna con uno scopo preciso, che insieme compongono un framework. Ognuna risolve esattamente un problema, viene pubblicata da sola su Packagist ed \u00e8 testata da sola. Prendi solo ci\u00f2 che ti serve; nulla arriva come peso morto.<\/p>\n<p><strong>Esplicito invece che magico.<\/strong> Ogni dipendenza di cui una classe ha bisogno \u00e8 dichiarata in un metodo statico <code>depends_on()<\/code> \u2014 si legge dall&#8217;alto verso il basso come una lista della spesa, non viene risolta a runtime da un container che ispeziona il costruttore tramite reflection. Questa singola scelta \u00e8 il motivo per cui il framework \u00e8 veloce all&#8217;avvio e, altrettanto importante, veloce da leggere: per sapere &#8220;di cosa ha bisogno questa classe per funzionare&#8221; basta guardare un metodo, non seguire le regole di autowiring di un container.<\/p>\n<p><strong>Pensato per un codice leggibile e disciplinato.<\/strong> Ogni identificatore \u2014 variabili, funzioni, metodi, propriet\u00e0 \u2014 \u00e8 in <code>snake_case<\/code>, con un piccolo insieme di postfissi coerenti (<code>_id<\/code>, <code>_dt<\/code>, <code>_n<\/code>, <code>_c<\/code>\u2026) che ti dicono che tipo di valore stai guardando ancora prima di aver letto la logica. La convenzione \u00e8 imposta da un linter (<code>libs:check<\/code>), non \u00e8 solo una linea guida \u2014 quindi non si degrada mai in silenzio.<\/p>\n<p><strong>Davvero leggero, il che significa davvero veloce.<\/strong> Pochi livelli tra una richiesta e il tuo codice, nessuna risoluzione di DI basata su reflection ad ogni avvio, nessuna astrazione ORM impilata su un&#8217;altra astrazione. Non \u00e8 solo un vantaggio in velocit\u00e0 di esecuzione \u2014 \u00e8 anche il motivo per cui l&#8217;intero codice resta leggibile man mano che cresce.<\/p>\n<p><strong>Pensato per come si scrive software oggi.<\/strong> Un codice piccolo, coerente e con poca magia non \u00e8 solo pi\u00f9 facile da tenere a mente per una persona \u2014 \u00e8 anche molto pi\u00f9 economico e veloce da usare insieme a un assistente AI per la programmazione. Meno boilerplate e nessun collegamento nascosto a runtime da decifrare significano che un AI pair-programmer spende i suoi token sul tuo problema reale, non per capire come funziona il framework \u2014 cos\u00ec le funzionalit\u00e0 arrivano prima e costano meno da sviluppare.<\/p>\n<div class=\"italix-why-columns\" style=\"margin: 30px 0;\">\n<div class=\"italix-why-col\">\n<h3 style=\"margin-bottom: 30px;\">Include gi\u00e0 tutto ci\u00f2 di cui un&#8217;applicazione reale ha davvero bisogno<\/h3>\n<ul>\n<li>Un framework di test completo e senza dipendenze (<code>italix\/testing<\/code>) \u2014 un client HTTP in-process, factory di righe derivate dallo schema, isolamento tramite rollback \u2014 cos\u00ec le suite di test non devono trascinarsi dietro PHPUnit solo per verificare che una route funzioni.<\/li>\n<li>Tabelle e alberi di dati lato server gi\u00e0 pronti (<code>italix\/datasets<\/code>) \u2014 basati su Tabulator, con colonne e azioni dichiarate in PHP.<\/li>\n<li>Un livello completo per i form (<code>italix\/forms<\/code>) \u2014 costruisci un form HTML validato direttamente dallo schema di una tabella, senza markup scritto a mano.<\/li>\n<li>Calendari e feed di eventi (<code>italix\/calendars<\/code>) \u2014 sorgenti dichiarate in PHP, un driver genera la configurazione lato client.<\/li>\n<li>Un pattern CRUD a template-method (<code>BaseAdminAction<\/code>) che ti d\u00e0 un pannello admin funzionante \u2014 elenco, creazione, modifica, cancellazione, validazione \u2014 a partire da quattro metodi brevi, non una riscrittura per ogni risorsa.<\/li>\n<\/ul>\n<\/div>\n<div class=\"italix-why-col\">\n<h3 style=\"margin-bottom: 30px;\">Qualche altro vantaggio che vale la pena conoscere<\/h3>\n<ul>\n<li><strong>La sicurezza non \u00e8 aggiunta in un secondo momento.<\/strong> La codifica dell&#8217;output \u00e8 un tipo, non un&#8217;abitudine (<code>italix\/encode<\/code>) \u2014 un linter dei template individua l&#8217;output non codificato prima che vada in produzione. Le sessioni portano di default elenco dei dispositivi, revoca, rilevamento dei replay e ri-autenticazione step-up (<code>italix\/session<\/code>). I file caricati vengono salvati tramite hash del contenuto, con il MIME rilevato e verificato su una whitelist, senza mai fidarsi del nome file fornito da chi chiama (<code>italix\/storage<\/code>).<\/li>\n<li><strong>Validazione onesta, non solo vero\/falso.<\/strong> Il motore delle regole restituisce un vero e proprio terzo verdetto \u2014 <em>sconosciuto<\/em> \u2014 per i controlli che non pu\u00f2 realmente confermare, invece di dichiarare in silenzio qualcosa come valido quando in realt\u00e0 non lo ha mai verificato. Codici di errore macchina ovunque, non prosa da interpretare.<\/li>\n<li><strong>Internazionalizzazione vera<\/strong>, non semplici tabelle di stringhe: categorie plurali basate su ICU\/CLDR, numeri, valute e date sensibili alla locale.<\/li>\n<li><strong>Si integra bene con il resto dell&#8217;ecosistema PHP.<\/strong> PSR-15, PSR-11, PSR-16, PSR-7 ovunque \u2014 \u00e8 un framework, non un giardino recintato: strumenti PHP standard e pacchetti conformi agli standard si inseriscono senza attriti.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<style>\n.italix-libs-grid {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: 2.5rem 2rem;\n}\n.italix-libs-grid .italix-lib-card {\n    display: flex;\n    align-items: flex-start;\n    gap: 1.5rem;\n}\n.italix-libs-grid .italix-lib-icon-box {\n    flex: 0 0 auto;\n    margin: 0;\n    width: 33%;\n    aspect-ratio: 1 \/ 1;\n}\n.italix-libs-grid .italix-lib-text {\n    flex: 1 1 auto;\n    min-width: 0;\n}\n.italix-libs-grid .italix-lib-text h2 {\n    margin-top: 0;\n}\n.italix-libs-grid .italix-lib-links a {\n    text-decoration: underline;\n}\n@media (max-width: 767px) {\n    .italix-libs-grid {\n        grid-template-columns: minmax(0, 1fr);\n    }\n    .italix-libs-grid .italix-lib-card {\n        flex-direction: column;\n    }\n    .italix-libs-grid .italix-lib-icon-box {\n        width: 100%;\n    }\n}\n<\/style>\n<div class=\"italix-libs-grid\">\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-libs-icon.webp\" alt=\"Icona Italix Libs\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Libs<\/h2>\n<p>Un framework PHP modulare, costituito da librerie Composer indipendenti e pubblicamente disponibili \u2014 scegli solo ci\u00f2 che ti serve, dal routing all&#8217;ORM, dalla validazione all&#8217;i18n e ai test.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/?query=italix%2F\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-contracts-icon.webp\" alt=\"Icona Italix Contracts\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Contracts<\/h2>\n<p>Contratti condivisi (interfacce) per le librerie Italix \u2014 permette un&#8217;integrazione fluida tra italix\/orm, italix\/forms e le altre librerie compatibili.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/contracts\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/contracts\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-mvc-icon.webp\" alt=\"Icona Italix Mvc\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Mvc<\/h2>\n<p>Motore PSR-15, pipeline di middleware, registro dei servizi, controller con dipendenze dichiarate, motore di viste con layout a blocchi, sessioni e traduzioni.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/mvc\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/mvc\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-orm-icon.webp\" alt=\"Icona Italix Orm\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Orm<\/h2>\n<p>Un ORM leggero e type-safe per PHP, con migrazioni, query builder e supporto per MySQL, PostgreSQL, SQLite e Supabase.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/orm\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/orm\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-routing-icon.webp\" alt=\"Icona Italix Routing\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Routing<\/h2>\n<p>Route con nome e generazione di URL: dichiara una route una sola volta, collegati ad essa per nome, e ottieni un errore esplicito in fase di generazione invece di un 404 pi\u00f9 avanti.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/routing\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/routing\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-encode-icon.webp\" alt=\"Icona Italix Encode\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Encode<\/h2>\n<p>Codifica dell&#8217;output sensibile al contesto, come tipo: testo HTML, attributi, URL e JSON, con un linter dei template che individua output non codificato.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/encode\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/encode\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-datasets-icon.webp\" alt=\"Icona Italix DataSets\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix DataSets<\/h2>\n<p>Tabelle e alberi di dati lato server: definizioni di colonne e azioni in PHP, configurazione client generata da un driver, nomi di colonna in whitelist.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/datasets\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/datasets\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-forms-icon.webp\" alt=\"Icona Italix Forms\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Forms<\/h2>\n<p>Metadati dei form e rendering HTML: descrittori FormMeta\/FieldMeta, widget e adapter che costruiscono un form a partire dallo schema di una tabella.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/forms\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/forms\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-rules-icon.webp\" alt=\"Icona Italix Rules\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Rules<\/h2>\n<p>Vocabolario ed esecutore di validazione: codici di errore macchina invece di prosa, e un terzo verdetto \u2014 sconosciuto \u2014 per i controlli che non pu\u00f2 onestamente stabilire.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/rules\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/rules\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-auth-icon.webp\" alt=\"Icona Italix Auth\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Auth<\/h2>\n<p>Autenticazione con password con un ordine resistente ai leak, e policy di autorizzazione che possono astenersi dal decidere. Non include alcuna tabella n\u00e9 gestione delle sessioni.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/auth\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/auth\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-session-icon.webp\" alt=\"Icona Italix Session\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Session<\/h2>\n<p>Sessioni come record su un soggetto e un tenant: elenco dei dispositivi, revoca per singolo account, rilevamento dei replay, ri-autenticazione step-up, limiti di concorrenza e store collegabili.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/session\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/session\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-i18n-icon.webp\" alt=\"Icona Italix I18n\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix I18n<\/h2>\n<p>Traduzione e formattazione basate su ICU: categorie plurali CLDR, numeri, valute e date sensibili alla locale, e un estrattore di chiavi che rifiuta di indovinare.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/i18n\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/i18n\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-testing-icon.webp\" alt=\"Icona Italix Testing\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Testing<\/h2>\n<p>Client HTTP PSR-15 in-process, factory di righe derivate dallo schema, isolamento tramite rollback e un test runner essenziale.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/testing\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/testing\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-console-icon.webp\" alt=\"Icona Italix Console\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Console<\/h2>\n<p>Runner CLI del framework: comandi elencati, non scoperti automaticamente, dipendenze dichiarate come in un controller, container PSR-11, codici di uscita che hanno un significato.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/console\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/console\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-storage-icon.webp\" alt=\"Icona Italix Storage\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Storage<\/h2>\n<p>Storage di file in cui chi lo chiama non sceglie mai il nome del file: percorsi basati sull&#8217;hash del contenuto, estensione dedotta dal MIME rilevato tramite whitelist.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/storage\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/storage\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-documents-icon.webp\" alt=\"Icona Italix Documents\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Documents<\/h2>\n<p>Un albero di documenti versionato con nomi leggibili, proiettato su una directory reale che puoi modificare con qualsiasi strumento.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/documents\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/documents\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-media-icon.webp\" alt=\"Icona Italix Media\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Media<\/h2>\n<p>Driver di conversione di formato per immagini, audio e video per italix\/converters.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/media\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/media\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-converters-icon.webp\" alt=\"Icona Italix Converters\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Converters<\/h2>\n<p>Un contratto di conversione di formato a coppie e un registro di driver a percorso pi\u00f9 breve \u2014 l&#8217;infrastruttura condivisa tra italix\/documents e italix\/media, di cui nessuno dei due \u00e8 proprietario.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/converters\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/converters\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-crypto-icon.webp\" alt=\"Icona Italix Crypto\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Crypto<\/h2>\n<p>Token firmati con scadenza, cifratura autenticata e rate limiting a finestra fissa, con rotazione delle chiavi integrata.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/crypto\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/crypto\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-cache-icon.webp\" alt=\"Icona Italix Cache\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Cache<\/h2>\n<p>Caching in stile PSR-16: un driver a file basato su opcache, un driver ad array, e un adapter su qualsiasi KeyValueStore di Contracts.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/cache\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/cache\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-events-icon.webp\" alt=\"Icona Italix Events\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Events<\/h2>\n<p>Eventi con nome e listener dichiarati: stampabili, senza wildcard, senza cancellazione, e un listener che lancia un&#8217;eccezione non trascina con s\u00e9 il dispatcher.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/events\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/events\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-jobs-icon.webp\" alt=\"Icona Italix Jobs\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Jobs<\/h2>\n<p>Coda basata su database e scheduling cron: payload JSON invece di oggetti serializzati, presa in carico atomica, backoff, ripristino dei worker bloccati.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/jobs\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/jobs\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-mail-icon.webp\" alt=\"Icona Italix Mail\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Mail<\/h2>\n<p>Email transazionali che non possono fallire in silenzio: la riga di log viene scritta prima ancora di toccare il trasporto. SMTP incluso nel core, PHPMailer opzionale.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/mail\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/mail\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"italix-lib-card\">\n<figure class=\"wp-block-image italix-lib-icon-box\" style=\"position: relative; background-color: #2e2c31; box-sizing: border-box; overflow: hidden;\"><img decoding=\"async\" style=\"display: block; position: absolute; top: 14%; left: 14%; width: 72%; height: 72%; object-fit: contain;\" src=\"https:\/\/www.italix.net\/wp-content\/uploads\/2026\/08\/italix-calendars-icon.webp\" alt=\"Icona Italix Calendars\"><\/figure>\n<div class=\"italix-lib-text\">\n<h2>Italix Calendars<\/h2>\n<p>Insiemi di calendari e feed di eventi: sorgenti dichiarate in PHP, configurazione client generata da un driver.<\/p>\n<p class=\"italix-lib-links\"><a href=\"https:\/\/github.com\/italix-net\/calendars\" target=\"_blank\" rel=\"noopener\">GitHub<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/packagist.org\/packages\/italix\/calendars\" target=\"_blank\" rel=\"noopener\">Packagist<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Italix non \u00e8 un framework monolitico che installi e dentro cui vivi \u2014 \u00e8 una famiglia di librerie PHP indipendenti, ciascuna con uno scopo preciso, che insieme compongono un framework. Ognuna risolve esattamente un problema, viene pubblicata da sola su Packagist ed \u00e8 testata da sola. Prendi solo ci\u00f2 che ti serve; nulla arriva come [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"https:\/\/www.italix.net\/el\/wp-json\/wp\/v2\/pages\/7983"}],"collection":[{"href":"https:\/\/www.italix.net\/el\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.italix.net\/el\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.italix.net\/el\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.italix.net\/el\/wp-json\/wp\/v2\/comments?post=7983"}],"version-history":[{"count":31,"href":"https:\/\/www.italix.net\/el\/wp-json\/wp\/v2\/pages\/7983\/revisions"}],"predecessor-version":[{"id":8046,"href":"https:\/\/www.italix.net\/el\/wp-json\/wp\/v2\/pages\/7983\/revisions\/8046"}],"wp:attachment":[{"href":"https:\/\/www.italix.net\/el\/wp-json\/wp\/v2\/media?parent=7983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}