{"id":984,"date":"2021-03-30T14:35:22","date_gmt":"2021-03-30T14:35:22","guid":{"rendered":"https:\/\/www.giuseppemaccario.com\/?p=984"},"modified":"2025-08-27T12:39:26","modified_gmt":"2025-08-27T12:39:26","slug":"come-costruire-un-semplice-framework-mvc-con-php","status":"publish","type":"post","link":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/","title":{"rendered":"Come costruire un semplice framework MVC con PHP"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduzione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Oggi illustrer\u00f2 come creare un semplice framework PHP seguendo il <strong>pattern MVC (Model-View-Controller)<\/strong>. Per questo articolo mi sono ispirato a un corso PHP che ho tenuto qualche anno fa, in cui ho costruito una semplice applicazione di e-commerce con gli studenti. Questo progetto di e-commerce era basato su un semplice framework PHP MVC. Grazie a questa esperienza, le persone che hanno continuato a codificare e programmare hanno capito cosa significa MVC prima di mettere le mani su un vero framework.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I framework MVC sono ampiamente utilizzati nel settore perch\u00e9 offrono molti vantaggi per uno sviluppo rapido e strutturato. Ci sono framework MVC per la maggior parte dei linguaggi di programmazione che potreste conoscere, da DotNet a PHP. Sfortunatamente, questi framework potrebbero avere una curva di apprendimento ripida. Questo \u00e8 dovuto al fatto che le persone devono imparare a scrivere codice nell&#8217;ecosistema del framework.<\/p>\n\n\n\n<div class=\"lead-magnet-form\" id=\"lead-magnet-6a91541771cd1\">\n\t<h3>Scarica gratuitamente<\/h3>\n\t<p>Scarica la mia guida PDF passo passo e impara a creare da zero un framework MVC PHP leggero!<\/p>\n\n\t<div class=\"lead-magnet-messages\"><\/div>\n\n\t<form class=\"lead-magnet-email-form\">\n\t\t<input type=\"email\"\n\t\t\t\tname=\"email\"\n\t\t\t\tplaceholder=\"Enter your email address\"\n\t\t\t\trequired>\n\t\t<input type=\"hidden\" name=\"file\" value=\"Come-costruire-un-semplice-framework-MVC-con-PHP.pdf\">\n\t\t<button type=\"submit\">Ottieni il link<\/button>\n\t<\/form>\n<\/div>\n\n\n\n\n<h2 class=\"wp-block-heading\">Nota personale sui framework PHP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nel 2010 gi\u00e0 sviluppavo software da pi\u00f9 di 5 anni, e stavo cercando una buona soluzione per costruire un&#8217;applicazione web per il mio capo dell&#8217;epoca. Discutendo con un mio ex collega (grazie Davide C.!), ho iniziato ad usare Symfony 1.4. Ho usato l&#8217; &#8220;approccio <strong>RTFM<\/strong>&#8221; (Read The Friendly Manual\u2026) prima di scrivere qualsiasi parte. In due mesi ho realizzato un&#8217;applicazione di media complessit\u00e0 (registrazione, ACL, dashboard, frontend, ecc.).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In seguito, ho lavorato su Zend Framework, Symfony 2.0 e 5, e Laravel (attualmente lavorando sulla 5.8), e anche su microframework come Silex (non pi\u00f9 mantenuto), Slim 3 e Lumen. Senza dubbio, il mio framework preferito \u00e8 <strong>Laravel<\/strong>. Nonostante alcune &#8220;cose magiche&#8221; che possono spaventare le persone, Laravel offre un sacco di caratteristiche out-of-the-box che si possono semplicemente attivare con la giusta configurazione.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cosa significa MVC?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MVC \u00e8 un <strong>design pattern<\/strong> utilizzato per separare i dati (Model), le interfacce utente (View) e la logica dell&#8217;applicazione (Controller). Per essere in grado di seguire questo articolo, \u00e8 necessario avere una buona conoscenza di PHP e OOP (Programmazione ad oggetti. User\u00f2 anche <strong>composer<\/strong> per gestire le l&#8217;autoloading e le dipendenze PHP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creare un semplice framework MVC con PHP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Indipendentemente dal fatto che stiate usando <a rel=\"noreferrer noopener\" href=\"https:\/\/www.docker.com\/\" target=\"_blank\">Docker<\/a>, XAMPP, o qualsiasi altra cosa per il vostro ambiente di sviluppo, iniziamo a creare una semplice struttura per il nostro framework MVC. Per tutti i miei progetti uso una cartella chiamata &#8220;Solutions&#8221;, quindi se anche tu vuoi seguirmi, entra nella tua cartella Solutions, quindi crea una nuova cartella chiamata &#8220;simple-php-mvc&#8221; e poi entra in questa ultima cartella.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Creiamo le cartelle di base per il vostro MVC:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>app<\/li>\n\n\n\n<li>config<\/li>\n\n\n\n<li>public<\/li>\n\n\n\n<li>views<\/li>\n\n\n\n<li>routes<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Iniziando in piccolo, creiamo i due file pi\u00f9 importanti del nostro semplice MVC: <em>index.php<\/em> e <em>htaccess<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Il file di configurazione htaccess<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Entra nella cartella public, e creiamo un file chiamato index.php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ora, al livello principale del tuo progetto, creiamo un nuovo file chiamato .htaccess <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aprilo con il tuo editor di testo preferito, e metti questo codice dentro il file htaccess:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;IfModule mod_rewrite.c&gt;\nRewriteEngine On\n\n# Stop processing if already in the \/public directory\nRewriteRule ^public\/ - &#091;L]\n\n# Static resources if they exist\nRewriteCond %{DOCUMENT_ROOT}\/public\/$1 -f\nRewriteRule (.+) public\/$1 &#091;L]\n\n# Route all other requests\nRewriteRule (.*) public\/index.php?route=$1 &#091;L,QSA]\n&lt;\/IfModule&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Htaccess \u00e8 un file di configurazione per il server web Apache, e la direttiva mod_rewrite dice ad Apache che ogni richiesta finir\u00e0 alla index.php situata nella cartella chiamata public. <strong>Che cosa significa?<\/strong> Significa che se navighi su <em>https:\/\/simple-php-mvc\/page1<\/em>, <em>https:\/\/simple-php-mvc\/page2<\/em> o <em>https:\/\/simple-php-mvc\/page3<\/em>, tutte le richieste finiranno nella index.php sotto public, che \u00e8 <strong>il punto di ingresso del tuo framework MVC<\/strong>. Questo \u00e8 un grande vantaggio perch\u00e9 ora puoi gestire la richiesta in un solo posto, capire quale risorsa \u00e8 stata richiesta e fornire la giusta risposta.<br>Un&#8217;altra cosa: usando htaccess e guidando il traffico sotto la cartella public, il resto della struttura del tuo progetto sar\u00e0 nascosto a chiunque!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ecco come appare il tuo progetto in questo momento:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.giuseppemaccario.com\/wp-content\/uploads\/2021\/03\/mvc-design-pattern-folder-structure.png\" alt=\"PHP MVC application folder structure\" class=\"wp-image-1230\"\/><figcaption class=\"wp-element-caption\">Folder structure<\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>app\nconfig\npublic\n    index.php\nviews\nroutes\n.htaccess<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Bootstrap del framework MVC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ora hai bisogno di un modo per avviare la tua applicazione e caricare il codice di cui hai bisogno. Abbiamo gi\u00e0 detto che index.php sotto la cartella public \u00e8 il punto di ingresso, per questo motivo includiamo i file necessari da l\u00ec.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di tutto, carichiamo il file di configurazione. Qui il contenuto del file index.php:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Load Config\nrequire_once '..\/config\/config.php';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ora possiamo creare un file config.php sotto la cartella config.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All&#8217;interno del file di configurazione, possiamo salvare le impostazioni del framework, per esempio, possiamo memorizzare il nome della nostra applicazione, il percorso della root, e, naturalmente, i parametri di connessione al database:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/\/site name\ndefine('SITE_NAME', 'your-site-name');\n\n\/\/App Root\ndefine('APP_ROOT', dirname(dirname(__FILE__)));\ndefine('URL_ROOT', '\/');\ndefine('URL_SUBFOLDER', '');\n\n\/\/DB Params\ndefine('DB_HOST', 'your-host');\ndefine('DB_USER', 'your-username');\ndefine('DB_PASS', 'your-password');\ndefine('DB_NAME', 'your-db-name');<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nota<\/strong>: se hai deciso di mettere il framework in una sottocartella, apri <em>\/config\/config.php<\/em> e imposta il nome della sottocartella come valore della costante <em>URL_SUBFOLDER<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Autolader<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vogliamo essere in grado di caricare le future classi senza alcun troppi sforzi, ovvero senza essere costretti a scrivere dozzine di include o require, quindi useremo l&#8217;<strong>autoloading PSR-4<\/strong> con Composer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c8 stato segnalato che alcuni hosting necessitano della direttiva <em>classmap<\/em>: <em>classmap <\/em>esaminer\u00e0 ricorsivamente i file .php e .inc nelle directory e nei file specificati e rilever\u00e0 le classi in essi contenute.<br><a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Composer <\/a>\u00e8 un gestore di dipendenze per PHP e permette di dichiarare le librerie da cui dipende il tuo progetto e lui le gestir\u00e0 per te. Davvero utile!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per prima cosa, a livello di root, dovete creare un file chiamato composer.json e aggiungere il seguente contenuto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"name\": \"gmaccario\/simple-mvc-php-framework\",\n    \"description\": \"Simple MVC PHP framework\",\n    \"autoload\": {\n        \"psr-4\": {\n            \"App\\\\\": \"app\/\"\n        },\n        \"classmap\": &#091;\n            \"app\/\"\n        ]\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Supponendo che abbiate gi\u00e0 <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">installato composer<\/a> sul vostro computer o nel vostro container, eseguite <a href=\"https:\/\/github.com\/gmaccario\/simple-mvc-php-framework\/issues\/19\" target=\"_blank\" rel=\"noreferrer noopener\">il seguente comando<\/a> a livello di root del vostro progetto, a seconda di dove state lavorando e dove \u00e8 stato installato composer::<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer install<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se ora controlli la tua cartella principale, puoi vedere una nuova cartella chiamata vendor che contiene il file autoload.php e la cartella composer.  Aprite il file index.php e aggiungete semplicemente il seguente codice all&#8217;inizio del file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>require_once '..\/vendor\/autoload.php';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">D&#8217;ora in poi, potete usare <em>App <\/em>come punto di partenza dei vostri namespace, in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>use App\\Controllers\\MyController;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ora, impariamo cosa significa l&#8217;acronimo MVC.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<script async=\"\" src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-2633235798387105\" crossorigin=\"anonymous\"><\/script>\n<!-- WP Posts -->\n<ins class=\"adsbygoogle\" style=\"display:block\" data-ad-client=\"ca-pub-2633235798387105\" data-ad-slot=\"3630233600\" data-ad-format=\"auto\" data-full-width-responsive=\"true\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Model<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un modello \u00e8 un oggetto che rappresenta i vostri dati. Il modello sar\u00e0 forgiato sulla struttura della vostra tabella di database e interagir\u00e0 con le operazioni del database (creare, leggere, aggiornare e cancellare). <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per esempio, avete una tabella Prodotti come questa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE IF NOT EXISTS products (\n  id int(10) NOT NULL auto_increment,\n  title varchar(255) collate utf8_unicode_ci NOT NULL,\n  description text collate utf8_unicode_ci,\n  price decimal(12,5) NOT NULL,\n  sku varchar(255) collate utf8_unicode_ci NOT NULL,\n  image varchar(255) collate utf8_unicode_ci NOT NULL,\n  PRIMARY KEY  (id)\n) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di tutto, creiamo una nuova cartella chiamata <em>Models <\/em>dentro la cartella <em>app<\/em>. Poi creiamo un nuovo file chiamato Product sotto Models. <\/p>\n\n\n\n<pre class=\"wp-block-verse\"><strong>NOTA:<\/strong> L'obiettivo di questo articolo \u00e8 spiegare come implementare un semplice MVC utilizzando PHP, non spiegare i principi SOLID. Quindi, in questo contesto, mescoler\u00f2 il contesto del modello con l'accesso al database. Questo si avvicina al pattern Active Record, anche se si possono usare alternative come il pattern Data Mapper. <br>Il modello Active Record in breve:<br>- Ogni istanza della classe rappresenta una singola riga nel database.<br>- Metodi come save, findBy, update e delete interagiscono direttamente con il database.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il tuo modello di prodotto sar\u00e0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \nnamespace App\\Models;\n\nclass Product\n{\n    protected $id;\n    protected $title;\n    protected $description;\n    protected $price;\n    protected $sku;\n    protected $image;\n\n    \/\/ GET METHODS\n    public function getId()\n    {\n        return $this-&gt;id;\n    }\n\n    public function getTitle()\n    {\n        return $this-&gt;title;\n    }\n\n    public function getDescription()\n    {\n        return $this-&gt;description;\n    }\n\n    public function getPrice()\n    {\n        return $this-&gt;price;\n    }\n\n    public function getSku()\n    {\n        return $this-&gt;sku;\n    }\n\n    public function getImage()\n    {\n        return $this-&gt;image;\n    }\n\n    \/\/ SET METHODS\n    public function setTitle(string $title)\n    {\n        $this-&gt;title = $title;\n    }\n\n    public function setDescription(string $description)\n    {\n        $this-&gt;description = $description;\n    }\n\n    public function setPrice(string $price)\n    {\n        $this-&gt;price = $price;\n    }\n\n    public function setSku(string $sku)\n    {\n        $this-&gt;sku = $sku;\n    }\n\n    public function setImage(string $image)\n    {\n        $this-&gt;image = $image;\n    }\n\n    \/\/ CRUD OPERATIONS\n    public function create(array $data)\n    {\n\n    }\n\n    public function read(int $id)\n    {\n\n    }\n\n    public function update(int $id, array $data)\n    {\n\n    }\n\n    public function delete(int $id)\n    {\n\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E questo \u00e8 tutto. Con i metodi, potrete lavorare con gli oggetti di cui avete bisogno, popolando gli attributi necessari dell&#8217;oggetto con i valori reali basati sul modello.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">View<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La vista \u00e8 responsabile di prendere i dati dal controllor e mostrare quei valori. Questo \u00e8 tutto. Ci sono molti motori di template per PHP, da <a rel=\"noreferrer noopener\" href=\"https:\/\/twig.symfony.com\/\" target=\"_blank\">Twig <\/a>a <a rel=\"noreferrer noopener\" href=\"https:\/\/laravel.com\/docs\/8.x\/blade\" target=\"_blank\">Blade<\/a>. Per questo tutorial, useremo solo del semplice HTML per rendere le cose semplici.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per creare una nuova vista, dobbiamo creare un nuovo file chiamato product.php sotto la cartella views. Sulla base degli attributi del prodotto, possiamo scrivere un semplice HTML come questo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n\n&lt;head&gt;\n    &lt;meta charset=\"utf-8\"&gt;\n    &lt;meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"&gt;\n    &lt;meta name=\"description\" content=\"\"&gt;\n    &lt;meta name=\"author\" content=\"\"&gt;\n    &lt;link rel=\"shortcut icon\" href=\"favicon.png\"&gt;\n    &lt;title&gt;Simple PHP MVC&lt;\/title&gt;\n    &lt;link rel=\"stylesheet\" href=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.5.2\/css\/bootstrap.min.css\"&gt;\n&lt;\/head&gt;\n\n&lt;body&gt;\n\n    &lt;section&gt;\n        &lt;h1&gt;My Product:&lt;\/h1&gt;\n        &lt;ul&gt;\n            &lt;li&gt;&lt;?php echo $product-&gt;getTitle(); ?&gt;&lt;\/li&gt;\n            &lt;li&gt;&lt;?php echo $product-&gt;getDescription(); ?&gt;&lt;\/li&gt;\n            &lt;li&gt;&lt;?php echo $product-&gt;getPrice(); ?&gt;&lt;\/li&gt;\n            &lt;li&gt;&lt;?php echo $product-&gt;getSku(); ?&gt;&lt;\/li&gt;\n            &lt;li&gt;&lt;?php echo $product-&gt;getImage(); ?&gt;&lt;\/li&gt;\n        &lt;\/ul&gt;\n        &lt;a href=\"&lt;?php echo $routes-&gt;get('homepage')-&gt;getPath(); ?&gt;\"&gt;Back to homepage&lt;\/a&gt;\n    &lt;section&gt;\n\n    &lt;script src=\"https:\/\/code.jquery.com\/jquery-3.6.0.min.js\" \n        integrity=\"sha256-\/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej\/m4=\" \n        crossorigin=\"anonymous\"&gt;&lt;\/script&gt;\n    &lt;script src=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.5.2\/js\/bootstrap.min.js\"&gt;&lt;\/script&gt;\n&lt;\/body&gt;\n\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La vista \u00e8 ora pronta per ricevere l&#8217;oggetto <em>$prodotto<\/em> e visualizzare i suoi valori.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Controller<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il controller \u00e8 il cuore della logica dell&#8217;applicazione. \u00c8 responsabile di accettare l&#8217;input e convertirlo in comandi per il modello o la vista. Creiamo una nuova cartella chiamata Controllers sotto la cartella <em>app<\/em>, e creiamo un nuovo file controller chiamato ProductController.php. Qui il contenuto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \n\nnamespace App\\Controllers;\n\nuse App\\Models\\Product;\nuse Symfony\\Component\\Routing\\RouteCollection;\n\nclass ProductController\n{\n    \/\/ Show the product attributes based on the id.\n    public function showAction(int $id, RouteCollection $routes)\n    {\n        $product = new Product();\n        $product-&gt;read($id);\n\n        require_once APP_ROOT . '\/views\/product.php';\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Molto semplice, vero? Ovviamente, le cose potrebbero essere pi\u00f9 complesse, possiamo creare una classe controllor padre contenente metodi generici, un metodo di gestione vista e altre funzioni di aiuto. Ma per ora \u00e8 sufficiente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Il sistema di rotte<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ora abbiamo bisogno di un meccanismo per gestire gli URL. Vogliamo usare <em>friendly URL<\/em>s (URLs amichevoli); in altre parole, vogliamo avere a che fare con indirizzi web che siano facili da leggere e che includano parole che descrivano il contenuto della pagina web. Abbiamo quindi bisogno di <strong>un sistema di routing<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Possiamo creare il nostro personale sistema di rotte, oppure, dato che abbiamo usato composer per l&#8217;autoload, possiamo cercare nei pacchetti dell&#8217;ampio ecosistema <a href=\"https:\/\/symfony.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Symfony <\/a>e lavorare in modo intelligente!<br>Quindi, vediamo come possiamo trarre vantaggio dal componente Routing di Symfony. Qui la documentazione:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a rel=\"noreferrer noopener nofollow\" href=\"https:\/\/symfony.com\/doc\/current\/create_framework\/routing.html\" target=\"_blank\">https:\/\/symfony.com\/doc\/current\/create_framework\/routing.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di tutto, installare il componente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>composer require symfony\/routing<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.giuseppemaccario.com\/wp-content\/uploads\/2021\/03\/symfony-routing-install-with-composer.png\" alt=\"Install symfony\/routing via composer.\" class=\"wp-image-1231\"\/><figcaption class=\"wp-element-caption\">Installare symfony\/routing usando composer.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Se ora controllate all&#8217;interno della cartella vendor, potete vedere che \u00e8 stata creata una nuova cartella chiamata symfony.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cominciamo allora ad implementare il sistema di routing. L&#8217;obiettivo \u00e8 quello di visualizzare i valori del prodotto con ID=1 quando si naviga sull&#8217;URL \/prodotto\/1<br>Creiamo un nuovo file chiamato web.php sotto la cartella routes. Questo file conterr\u00e0 tutte le rotte della vostra applicazione.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \n\nuse Symfony\\Component\\Routing\\Route;\nuse Symfony\\Component\\Routing\\RouteCollection;\n\n\/\/ Routes system\n$routes = new RouteCollection();\n$routes-&gt;add('product', new Route(constant('URL_SUBFOLDER') . '\/product\/{id}', array('controller' =&gt; 'ProductController', 'method'=&gt;'showAction'), array('id' =&gt; '&#091;0-9]+')));<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Usiamo le classi Route e RouteCollection del componente Routing di Symfony per creare ed elencare tutte le rotte di cui abbiamo bisogno. Iniziamo con una singola pagina di prodotto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poi, creiamo il motore di routing. Aggiungi un nuovo file chiamato Router.php all&#8217;interno della cartella della tua app e metti questo codice al suo interno:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \n\nnamespace App;\n\nuse Symfony\\Component\\Routing\\RequestContext;\nuse Symfony\\Component\\Routing\\RouteCollection;\nuse Symfony\\Component\\Routing\\Matcher\\UrlMatcher;\nuse Symfony\\Component\\Routing\\Exception\\MethodNotAllowedException;\nuse Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException;\nuse Symfony\\Component\\Routing\\Exception\\NoConfigurationException;\n\nclass Router\n{\n    public function __invoke(RouteCollection $routes)\n    {\n        $context = new RequestContext();\n\n        \/\/ Routing can match routes with incoming requests\n        $matcher = new UrlMatcher($routes, $context);\n        try {\n            $arrayUri = explode('?', $_SERVER&#091;'REQUEST_URI']);\n            $matcher = $matcher-&gt;match($arrayUri&#091;0]);\n    \n            \/\/ Cast params to int if numeric\n            array_walk($matcher, function(&amp;$param)\n            {\n                if(is_numeric($param)) \n                {\n                    $param = (int) $param;\n                }\n            });\n    \n            \/\/ https:\/\/github.com\/gmaccario\/simple-mvc-php-framework\/issues\/2\n            \/\/ Issue #2: Fix Non-static method ... should not be called statically\n            $className = '\\\\App\\\\Controllers\\\\' . $matcher&#091;'controller'];\n            $classInstance = new $className();\n    \n            \/\/ Add routes as paramaters to the next class\n            $params = array_merge(array_slice($matcher, 2, -1), array('routes' =&gt; $routes));\n\n            call_user_func_array(array($classInstance, $matcher&#091;'method']), $params);\n            \n        } catch (MethodNotAllowedException $e) {\n            echo 'Route method is not allowed.';\n        } catch (ResourceNotFoundException $e) {\n            echo 'Route does not exists.';\n        } catch (NoConfigurationException $e) {\n            echo 'Configuration does not exists.';\n        }\n    }\n}\n\n\/\/ Invoke\n$router = new Router();\n$router($routes);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il codice \u00e8 semplice e parla da solo, ma spieghiamolo un po&#8217;: l&#8217;URL matcher prende l&#8217;URI della richiesta e controlla se c&#8217;\u00e8 una corrispondenza con le rotte definite in routes\/web.php. Se c&#8217;\u00e8 una corrispondenza, la funzione call_user_func_array far\u00e0 la magia, chiamando il metodo giusto del controller giusto.<br>Inoltre, abbiamo usato la funzione array_walk per fare il <a href=\"https:\/\/www.php.net\/manual\/en\/language.types.type-juggling.php\" target=\"_blank\" rel=\"noreferrer noopener\">cast<\/a> dei valori numerici in valori interi, perch\u00e9 nei nostri metodi abbiamo usato la <a href=\"https:\/\/www.php.net\/manual\/en\/language.types.declarations.php\" target=\"_blank\" rel=\"noreferrer noopener\">dichiarazione esplicita del tipo<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Querystring opzionale<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Per via di queste righe di codice:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$arrayUri = explode('?', $_SERVER&#091;'REQUEST_URI']);\n$matcher = $matcher-&gt;match($arrayUri&#091;0]);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">nei nostri controllers possiamo facilmente ottenere i valori dei parametri opzionali, in questo modo:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">URL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost\/product\/1?value1=true&amp;value2=false<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Controller:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var_dump($_GET&#091;'value1']);\nvar_dump($_GET&#091;'value2']);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Di solito, si utilizzano i valori inclusi nelle rotte, ma in alcuni casi questa soluzione pu\u00f2 essere utile, ad esempio quando si hanno molti parametri a causa dei filtri.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ora possiamo includere il sistema di rotte nel file index.php:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\n\/\/ Autoloader\nrequire_once '..\/vendor\/autoload.php';\n\n\/\/ Load Config\nrequire_once '..\/config\/config.php';\n\n\/\/ Routes\nrequire_once '..\/routes\/web.php';\nrequire_once '..\/app\/Router.php';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ora che abbiamo preparato il sistema di routing, possiamo navigare nella pagina \/product\/1 e vedere il risultato. Ovviamente i valori ora sono vuoti. Aggiungiamo alcuni valori fake al prodotto (dentro il file ProductController.php):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function read(int $id)\n{\n    $this-&gt;title = 'My first Product';\n    $this-&gt;description = 'Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum ';\n    $this-&gt;price = 2.56;\n    $this-&gt;sku = 'MVC-SP-PHP-01';\n    $this-&gt;image = 'https:\/\/via.placeholder.com\/150';\n\n    return $this;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E naviga di nuovo la pagina \/product\/1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ora puoi aggiungere la tua connessione al database e restituire i valori dal database, usando una query grezza o un ORM come <a href=\"https:\/\/symfony.com\/doc\/current\/doctrine.html\" target=\"_blank\" rel=\"noreferrer noopener\">Doctrine <\/a>o <a href=\"https:\/\/laravel.com\/docs\/5.0\/eloquent\" target=\"_blank\" rel=\"noreferrer noopener\">Eloquent<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Note aggiuntive sull&#8217;instradamento: le tue rotte potrebbero sovrapporsi l&#8217;una all&#8217;altra, per esempio, se scrivi <strong>\/{pageSlug}<\/strong> prima di qualsiasi altra rotta, come <strong>\/register<\/strong>. Puoi facilmente superare questo problema semplicemente scrivendo la tua rotta generale <strong>\/{pageSlug}<\/strong> alla fine di tutte le rotte. Questa rotta diventer\u00e0 il tuo fallback. Oppure, un&#8217;altra soluzione \u00e8 aggiungere un prefisso, come <strong>\/static\/{pageSlug}<\/strong> o <strong>\/public\/{pageSlug}<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La homepage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Prepariamo ora la rotta della homepage. Aprire il route\/web.php e aggiungere la nuova rotta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$routes-&gt;add('homepage', new Route(constant('URL_SUBFOLDER') . '\/', array('controller' =&gt; 'PageController', 'method'=&gt;'indexAction'), array()));<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ovviamente, dobbiamo creare il nuovo controllor PageController:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php \n\nnamespace App\\Controllers;\n\nuse App\\Models\\Product;\nuse Symfony\\Component\\Routing\\RouteCollection;\n\nclass PageController\n{\n        \/\/ Homepage action\n\tpublic function indexAction(RouteCollection $routes)\n\t{\n            $routeToProduct = str_replace('{id}', 1, $routes-&gt;get('product')-&gt;getPath());\n\n             require_once APP_ROOT . '\/views\/home.php';\n\t}\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E anche la nuova vista:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n\n&lt;head&gt;\n    &lt;meta charset=\"utf-8\"&gt;\n    &lt;meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"&gt;\n    &lt;meta name=\"description\" content=\"\"&gt;\n    &lt;meta name=\"author\" content=\"\"&gt;\n    &lt;link rel=\"shortcut icon\" href=\"favicon.png\"&gt;\n    &lt;title&gt;Simple PHP MVC&lt;\/title&gt;\n    &lt;link rel=\"stylesheet\" href=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.5.2\/css\/bootstrap.min.css\"&gt;\n&lt;\/head&gt;\n\n&lt;body&gt;\n\n\t&lt;section&gt;\n\t\t&lt;h1&gt;Homepage&lt;\/h1&gt;\n\t\t&lt;p&gt;\n            &lt;a href=\"&lt;?php echo $routeToProduct ?&gt;\"&gt;Check the first product&lt;\/a&gt;\n        &lt;\/p&gt;\n\t&lt;section&gt;\n\n    &lt;script src=\"https:\/\/code.jquery.com\/jquery-3.6.0.min.js\" \n\t\tintegrity=\"sha256-\/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej\/m4=\" \n\t\tcrossorigin=\"anonymous\"&gt;&lt;\/script&gt;\n    &lt;script src=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.5.2\/js\/bootstrap.min.js\"&gt;&lt;\/script&gt;\n&lt;\/body&gt;\n\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dato che usiamo lo stesso codice per l&#8217;intestazione e il pi\u00e8 di pagina, possiamo creare una cartella di layout e separare il codice per questi pezzi di HTML.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per navigare la pagina, aprite il vostro browser e navigate su questo URL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;URL esatto dipende dalle vostre impostazioni. Io uso <a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Docker<\/a> per il mio ambiente locale, e di solito imposto la porta, quindi il mio URL potrebbe essere leggermente diverso dal vostro, per esempio, io uso<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:8887\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nota<\/strong>: se hai installato il tuo progetto in una sottocartella come molti utenti sembrano fare, devi impostare la costante URL_SUBFOLDER nel file di configurazione. Per esempio, se hai installato questo progetto in una sottocartella chiamata <em>simple-mvc-php-framework<\/em>, il tuo URL finale sar\u00e0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost\/simple-mvc-php-framework\/<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Migliorare il framework MVC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Connessione al database e ORM, sessioni, cookies, un migliore controller per le pagine che accetti diversi parametri, o qualsiasi altra caratteristica pu\u00f2 essere aggiunta molto facilmente, ma questo articolo vuole mostrare solo il modo di costruire un semplice framework MVC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Scarica il codice<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Puoi scaricare il file zip, o clonare il codice di questo articolo tramite Github. <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/gmaccario\/simple-mvc-php-framework\" target=\"_blank\">https:\/\/github.com\/gmaccario\/simple-mvc-php-framework<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In questo articolo abbiamo visto come <mark>creare<\/mark> un semplice <mark>framework<\/mark> <mark>PHP<\/mark> seguendo il <strong>pattern <mark>MVC<\/mark>. <\/strong>Una volta che hai preso confidenza con il paradigma MVC, ti suggerisco di leggere la documentazione di Laravel (il mio framework MVC PHP preferito) o Symfony e iniziare a sperimentare! Noterai che lo sviluppo diventa pi\u00f9 veloce rispetto ad usare una soluzione PHP pura e scritta da zero.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Grazie per il vostro tempo, spero che abbiate ottenuto nuove informazioni sul paradigma MVC. Fammi sapere cosa pensi di questo articolo attraverso i commenti o <a href=\"https:\/\/www.giuseppemaccario.com\/it\/#contact\">mandami un messaggio<\/a>!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I framework MVC sono ampiamente utilizzati nel settore perch\u00e9 offrono molti vantaggi per uno sviluppo rapido e strutturato. Oggi mostrer\u00f2 come creare una semplice applicazione PHP seguendo il pattern MVC (Model-View-Controller). <\/p>\n","protected":false},"author":1,"featured_media":1233,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","ngg_post_thumbnail":0,"footnotes":""},"categories":[86,38,27],"tags":[89,87,41],"class_list":["post-984","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mvc","category-php","category-programming","tag-framework","tag-mvc","tag-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Come costruire un semplice framework MVC con PHP - Giuseppe Maccario<\/title>\n<meta name=\"description\" content=\"I framework MVC sono ampiamente utilizzati nel settore IT. Qui mostrer\u00f2 come creare un semplice framework PHP seguendo lo schema MVC.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Come costruire un semplice framework MVC con PHP - Giuseppe Maccario\" \/>\n<meta property=\"og:description\" content=\"I framework MVC sono ampiamente utilizzati nel settore IT. Qui mostrer\u00f2 come creare un semplice framework PHP seguendo lo schema MVC.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/\" \/>\n<meta property=\"og:site_name\" content=\"Giuseppe Maccario\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-30T14:35:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-27T12:39:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/03\/MVC-design-pattern.png\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"giuseppemaccario\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"giuseppemaccario\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/\"},\"author\":{\"name\":\"giuseppemaccario\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"headline\":\"Come costruire un semplice framework MVC con PHP\",\"datePublished\":\"2021-03-30T14:35:22+00:00\",\"dateModified\":\"2025-08-27T12:39:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/\"},\"wordCount\":2060,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"image\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/MVC-design-pattern.png\",\"keywords\":[\"framework\",\"mvc\",\"php\"],\"articleSection\":[\"mvc\",\"PHP\",\"Programming\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/\",\"name\":\"Come costruire un semplice framework MVC con PHP - Giuseppe Maccario\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/MVC-design-pattern.png\",\"datePublished\":\"2021-03-30T14:35:22+00:00\",\"dateModified\":\"2025-08-27T12:39:26+00:00\",\"description\":\"I framework MVC sono ampiamente utilizzati nel settore IT. Qui mostrer\u00f2 come creare un semplice framework PHP seguendo lo schema MVC.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/MVC-design-pattern.png\",\"contentUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/MVC-design-pattern.png\",\"width\":800,\"height\":600,\"caption\":\"MVC design pattern\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/come-costruire-un-semplice-framework-mvc-con-php\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Come costruire un semplice framework MVC con PHP\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/\",\"name\":\"Giuseppe Maccario\",\"description\":\"Sviluppatore Software in Amsterdam (NL)\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\",\"name\":\"giuseppemaccario\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\",\"width\":50,\"height\":50,\"caption\":\"giuseppemaccario\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Come costruire un semplice framework MVC con PHP - Giuseppe Maccario","description":"I framework MVC sono ampiamente utilizzati nel settore IT. Qui mostrer\u00f2 come creare un semplice framework PHP seguendo lo schema MVC.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/","og_locale":"it_IT","og_type":"article","og_title":"Come costruire un semplice framework MVC con PHP - Giuseppe Maccario","og_description":"I framework MVC sono ampiamente utilizzati nel settore IT. Qui mostrer\u00f2 come creare un semplice framework PHP seguendo lo schema MVC.","og_url":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/","og_site_name":"Giuseppe Maccario","article_published_time":"2021-03-30T14:35:22+00:00","article_modified_time":"2025-08-27T12:39:26+00:00","og_image":[{"width":800,"height":600,"url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/03\/MVC-design-pattern.png","type":"image\/png"}],"author":"giuseppemaccario","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"giuseppemaccario","Tempo di lettura stimato":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/#article","isPartOf":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/"},"author":{"name":"giuseppemaccario","@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"headline":"Come costruire un semplice framework MVC con PHP","datePublished":"2021-03-30T14:35:22+00:00","dateModified":"2025-08-27T12:39:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/"},"wordCount":2060,"commentCount":5,"publisher":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"image":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/#primaryimage"},"thumbnailUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/03\/MVC-design-pattern.png","keywords":["framework","mvc","php"],"articleSection":["mvc","PHP","Programming"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/","url":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/","name":"Come costruire un semplice framework MVC con PHP - Giuseppe Maccario","isPartOf":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/#primaryimage"},"image":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/#primaryimage"},"thumbnailUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/03\/MVC-design-pattern.png","datePublished":"2021-03-30T14:35:22+00:00","dateModified":"2025-08-27T12:39:26+00:00","description":"I framework MVC sono ampiamente utilizzati nel settore IT. Qui mostrer\u00f2 come creare un semplice framework PHP seguendo lo schema MVC.","breadcrumb":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/#primaryimage","url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/03\/MVC-design-pattern.png","contentUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2021\/03\/MVC-design-pattern.png","width":800,"height":600,"caption":"MVC design pattern"},{"@type":"BreadcrumbList","@id":"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.giuseppemaccario.com\/it\/"},{"@type":"ListItem","position":2,"name":"Come costruire un semplice framework MVC con PHP"}]},{"@type":"WebSite","@id":"https:\/\/www.giuseppemaccario.com\/it\/#website","url":"https:\/\/www.giuseppemaccario.com\/it\/","name":"Giuseppe Maccario","description":"Sviluppatore Software in Amsterdam (NL)","publisher":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.giuseppemaccario.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":["Person","Organization"],"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc","name":"giuseppemaccario","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png","url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png","contentUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png","width":50,"height":50,"caption":"giuseppemaccario"},"logo":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png"}}]}},"_links":{"self":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/984","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/comments?post=984"}],"version-history":[{"count":17,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/984\/revisions"}],"predecessor-version":[{"id":2608,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/984\/revisions\/2608"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/media\/1233"}],"wp:attachment":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/media?parent=984"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/categories?post=984"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/tags?post=984"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}