{"id":2576,"date":"2025-01-09T17:30:42","date_gmt":"2025-01-09T17:30:42","guid":{"rendered":"https:\/\/www.giuseppemaccario.com\/it\/?p=2576"},"modified":"2025-01-09T17:54:04","modified_gmt":"2025-01-09T17:54:04","slug":"mvc-best-practices-errori-comuni-e-come-evitarli","status":"publish","type":"post","link":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/","title":{"rendered":"Best Practices per l&#8217;Architettura MVC in PHP: Errori Comuni e Come Evitarli &#8211; Part 1: I Controller"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"best-practices-per-larchitettura-mvc-in-php-errori-comuni-e-come-evitarli---part-1-i-controller\">Sommario<\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#introduzione\">Introduzione<\/a><\/li>\n\n\n\n<li><a href=\"#mvc-in-php\">MVC in PHP<\/a><\/li>\n\n\n\n<li><a href=\"#perch%C3%A9-questo-articolo\">Perch\u00e9 questo articolo?<\/a><\/li>\n\n\n\n<li><a href=\"#errore-comune-confondere-le-responsabilit%C3%A0\">Errore Comune: Confondere le Responsabilit\u00e0<\/a><\/li>\n\n\n\n<li><a href=\"#comprendere-i-ruoli-di-modello-vista-e-controller\">Comprendere i Ruoli di Modello, Vista e Controller<\/a><\/li>\n\n\n\n<li><a href=\"#ruoli-e-best-practices-per-l-architettura-mvc-in-php\">Ruoli e Best Practices per l&#8217;Architettura MVC in PHP<\/a><\/li>\n\n\n\n<li><a href=\"#rispetto-delle-responsabilit%C3%A0-vantaggi\">Rispetto delle Responsabilit\u00e0: Vantaggi<\/a><\/li>\n\n\n\n<li><a href=\"#dove-scrivere-la-business-logic\">Dove scrivere la Business Logic<\/a><\/li>\n\n\n\n<li><a href=\"#classe-di-servizio-i-vantaggi\">Classe di Servizio: I vantaggi<\/a><\/li>\n\n\n\n<li><a href=\"#mantenere-i-controller-leggeri-S-O-L-I-D-e-single-action-controller\">Mantenere i Controller Leggeri: S.O.L.I.D. e Single Action Controller<\/a><\/li>\n\n\n\n<li><a href=\"#conclusione\">Conclusione<\/a><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"introduzione\">Introduzione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In questo articolo esploreremo alcune best practices per l&#8217;architettura MVC in PHP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;architettura MVC (<strong>Model-View-Controller<\/strong>) \u00e8 uno dei pi\u00f9 vecchi e popolari modelli di architettura standard del settore, inventato da <a href=\"https:\/\/en.wikipedia.org\/wiki\/Trygve_Reenskaug\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Trygve Reenskaug<\/a> a fine degli anni settanta. Ad oggi \u00e9 uno degli approcci pi\u00f9 utilizzati nello sviluppo di applicazioni web, grazie alla sua capacit\u00e0 di separare le responsabilit\u00e1 e migliorare la gestione del codice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In un&#8217;applicazione MVC, il <em>(M)odello<\/em> si concentra sulla gestione dei dati, la <em>(V)ista<\/em> si occupa della presentazione dei dati, e il <em>(C)ontroller<\/em> gestisce le interazioni dell&#8217;utente e coordina la logica applicativa. Questa separazione consente di creare applicazioni pi\u00f9 modulari, facilmente manutenibili e scalabili.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mvc-in-php\">MVC in PHP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In PHP, i maggiori framework come <a href=\"https:\/\/laravel.com\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Laravel<\/a> e <a href=\"https:\/\/symfony.com\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Symfony<\/a> sfruttano appieno i principi dell&#8217;architettura MVC per organizzare il codice in modo chiaro e funzionale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tuttavia, nonostante la sua popolarit\u00e0, implementare correttamente il pattern MVC non \u00e8 sempre semplice. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ho gi\u00e1 scritto un articolo riguardo l&#8217;MVC e sul come sia possibile <a href=\"https:\/\/www.giuseppemaccario.com\/it\/come-costruire-un-semplice-framework-mvc-con-php\/\">costruire facilmente un semplice framework MVC in PHP<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"perch\u00e9-questo-articolo\">Perch\u00e9 questo articolo?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ci tengo a precisare che scrivo questo articolo basandomi sulla mia esperienza personale. Ho lavorato in diverse aziende dove PHP era il linguaggio principale. Alcune di queste hanno anche provato a passare a tecnologie pi\u00f9 moderne, come Go, ma si sono ritrovate a gestire due team: uno che gestiva la nuova infrastruttura in Go e uno che continuava a occuparsi di PHP, sia per alcune nuove funzionalit\u00e1 che per tutto il vecchio progetto. Ma il business chiama, e non c\u2019\u00e8 mai tempo per rifattorizzare quelle enormi classi da 2 o 3 mila righe. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Non c\u2019\u00e8 tempo perch\u00e9 il business ha sempre la priorit\u00e0. E poi ci sono nuovi sviluppatori da integrare, gli standup, e&#8230; la pausa sigaretta e caff\u00e8. E infine ovviamente i meeting e i team-building.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il pattern che ho notato \u00e9 che con una base di codice confusa, poco organizzata e poco gestibile, con manager poco inclini al miglioramento, i nuovi programmatori perdono in fretta la voglia di aggiungere vero valore al software, e i pi\u00fa anziani tendono a guardarsi intorno dopo un p\u00f3. E poca passione nel nostro campo significa guai seri in futuro.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In questo articolo quindi, esploreremo alcuni degli errori comuni che si verificano durante l&#8217;implementazione dell&#8217;architettura MVC in PHP e fornir\u00f3 delle best practices per l&#8217;architettura MVC in PHP. Vedremo come migliorare la qualit\u00e0 del codice, mantenendo l&#8217;architettura chiara e scalabile. L\u2019obiettivo \u00e8 aiutare gli sviluppatori ad evitare gli errori pi\u00f9 frequenti e a rendere un&#8217;applicazione pi\u00f9 solida, manutenibile e pronta a crescere nel tempo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"comprendere-i-ruoli-di-modello-vista-e-controller\">Comprendere i Ruoli di Modello, Vista e Controller<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una corretta implementazione dell\u2019architettura MVC (Model-View-Controller) dipende dalla chiara comprensione dei ruoli di ciascun componente. Questo pattern \u00e8 progettato per separare le responsabilit\u00e0 e migliorare l\u2019organizzazione del codice, ma spesso gli sviluppatori, soprattutto i principianti, finiscono per sovrapporre le funzionalit\u00e0 di Modello, Vista e Controller, causando confusione e codice difficile da manutenere.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"errore-comune-confondere-le-responsabilit\u00e0\">Errore Comune: Confondere le Responsabilit\u00e0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Uno degli errori pi\u00f9 comuni \u00e8 mescolare le responsabilit\u00e0 tra i componenti. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esempi tipici includono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Inserire logica di business nel Controller, rendendolo troppo complesso e difficile da testare.<\/li>\n\n\n\n<li>Aggiungere logica di business o accesso ai dati direttamente nella Vista, con codice PHP che estrae dati dal database o esegue calcoli complessi.<\/li>\n\n\n\n<li>Utilizzare il Modello per attivit\u00e0 che dovrebbero essere gestite dalla Vista o dal Controller, come la formattazione dell\u2019output.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Questi errori possono portare a un codice poco flessibile e difficile da scalare.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ruoli-e-best-practices\">Ruoli e Best Practices per l&#8217;Architettura MVC in PHP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Per evitare questi problemi, \u00e8 fondamentale rispettare i ruoli specifici di ciascun componente dell\u2019architettura MVC. Di seguito alcune best practices per l&#8217;architettura MVC in PHP.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"il-modello-gestione-dei-dati-e-della-logica-di-business\">Il Modello: Gestione dei Dati e della Logica di Business<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Il Modello \u00e8 responsabile dell\u2019accesso ai dati, che pu\u00f2 includere letture\/scritture da un database, file o API.<\/li>\n\n\n\n<li>Contiene la logica di business, ovvero le regole e i comportamenti specifici dell&#8217;applicazione. Ad esempio, calcoli per uno sconto o la verifica della validit\u00e0 di una transazione.<\/li>\n\n\n\n<li>Deve essere autonomo e non dipendere dalla Vista o dal Controller, permettendo cos\u00ec di riutilizzare la logica in contesti diversi.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ecco un esempio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ProductModel \n{\n    public function getProductsByCategory(int $categoryId) \n    {\n        return Database::query(\"SELECT * FROM products WHERE category_id = ?\", &#91;$categoryId]);\n    }\n\n    public function calculateDiscount(float $price, int $discountPercentage) \n    {\n        return $price - ($price * $discountPercentage \/ 100);\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"il-controller-gestione-della-logica-applicativa-e-coordinamento\">Il Controller: Gestione della Logica Applicativa e Coordinamento<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Il Controller agisce come intermediario tra Modello e Vista.<\/li>\n\n\n\n<li>Riceve input dall\u2019utente (tramite URL, form o API) e decide quali Modelli chiamare e quali dati passare alla Vista.<\/li>\n\n\n\n<li>Deve essere il pi\u00f9 leggero possibile, delegando la logica al Modello.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ecco un esempio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ProductController \n{\n    private $model;\n\n    public function __construct(ProductModel $model) \n    {\n        $this-&gt;model = $model;\n    }\n\n    public function showProducts(int $categoryId) \n    {\n        $products = $this-&gt;model-&gt;getProductsByCategory($categoryId);\n\n        return view('views\/products.php', $products);\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"la-vista-presentazione-dei-dati\">La Vista: Presentazione dei Dati<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La Vista \u00e8 responsabile esclusivamente della presentazione dei dati all\u2019utente.<\/li>\n\n\n\n<li>Non deve contenere logica di business o accedere direttamente ai dati, ma solo mostrare ci\u00f2 che \u00e8 stato preparato dal Controller.<\/li>\n\n\n\n<li>Usare template engines (come Twig o Blade) pu\u00f2 aiutare a mantenere la Vista pulita e leggibile.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ecco un esempio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- views\/products.php --&gt;\n&lt;h1&gt;Prodotti&lt;\/h1&gt;\n&lt;ul&gt;\n    &lt;?php foreach ($products as $product): ?&gt;\n        &lt;li&gt;&lt;?= htmlspecialchars($product&#91;'name']) ?&gt; - \u20ac&lt;?= number_format($product&#91;'price'], 2) ?&gt;&lt;\/li&gt;\n    &lt;?php endforeach; ?&gt;\n&lt;\/ul&gt;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"rispetto-delle-responsabilit\u00e0-vantaggi\">Rispetto delle Responsabilit\u00e0: Vantaggi<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Manutenibilit\u00e0: Ogni componente \u00e8 indipendente, rendendo pi\u00f9 facile identificare e correggere eventuali problemi.<\/li>\n\n\n\n<li>Riutilizzabilit\u00e0: Il Modello pu\u00f2 essere riutilizzato in diversi contesti senza dipendere dalla Vista o dal Controller.<\/li>\n\n\n\n<li>Scalabilit\u00e0: Separare le responsabilit\u00e0 rende pi\u00f9 semplice aggiungere nuove funzionalit\u00e0 senza compromettere il codice esistente.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Rispettare i ruoli del Modello, Vista e Controller \u00e8 il primo passo per costruire applicazioni solide, manutenibili e scalabili.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dove-scrivere-la-business-logic\">Dove scrivere la Business Logic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La decisione su dove collocare la logica di business (nel Modello o in una classe di servizio separata) dipende dall&#8217;approccio e dalle best practices che si vogliono seguire nel progetto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quando-usare-il-modello-per-la-logica-di-business\">Quando Usare il Modello per la Logica di Business<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tradizionalmente, nell&#8217;architettura MVC, il Modello si occupa sia dell&#8217;accesso ai dati che della logica di business. Questo approccio funziona bene per applicazioni semplici o medie, dove la logica \u00e8 strettamente legata ai dati del dominio. Ad esempio:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Calcolare il totale di un ordine basandosi sui prodotti associati.\nVerificare che una prenotazione non superi la disponibilit\u00e0.\nIn questi casi, integrare la logica direttamente nel Modello pu\u00f2 rendere il codice pi\u00f9 compatto e facile da seguire.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quando-usare-una-classe-di-servizio\">Quando Usare una Classe di Servizio<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Per applicazioni pi\u00f9 complesse, separare la logica di business in una classe di servizio \u00e8 spesso una scelta migliore. Ecco perch\u00e9:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Separazione delle Responsabilit\u00e0<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Il Modello si concentra esclusivamente sui dati e sulle loro relazioni.<\/li>\n\n\n\n<li>Le classi di servizio gestiscono la logica di business, che pu\u00f2 combinare pi\u00f9 Modelli o includere logiche complesse non direttamente legate a un singolo Modello.<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Riutilizzabilit\u00e0<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Una classe di servizio \u00e8 pi\u00f9 facilmente riutilizzabile in contesti diversi, senza dover instanziare direttamente un Modello.<\/li>\n\n\n\n<li>La logica pu\u00f2 essere condivisa tra vari componenti dell&#8217;applicazione, come API, script CLI, o batch process.<\/li>\n<\/ul>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Testabilit\u00e0<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Separare la logica di business in una classe di servizio rende il codice pi\u00f9 facile da testare in modo isolato.<\/li>\n\n\n\n<li>I Modelli possono essere testati solo per la loro interazione con il database, mentre la logica di business pu\u00f2 essere verificata indipendentemente.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"classe-di-servizio-i-vantaggi\">Classe di Servizio: I vantaggi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Usare una classe di servizio per la logica di business \u00e8 generalmente una scelta pi\u00f9 robusta e scalabile, soprattutto per applicazioni grandi o complesse. Questo approccio:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Favorisce una chiara separazione delle responsabilit\u00e0.<\/li>\n\n\n\n<li>Migliora la riusabilit\u00e0 del codice.<\/li>\n\n\n\n<li>Aumenta la testabilit\u00e0 delle singole componenti.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mantenere-i-controller-leggeri-solid-e-single-action-controller\">Mantenere i Controller Leggeri: S.O.L.I.D. e Single Action Controller<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nel design di un\u2019applicazione MVC, uno degli aspetti pi\u00f9 importanti \u00e8 mantenere i controller leggeri e focalizzati. Questo si ottiene adottando il principio dei Single Action Controller e rispettando le best practices di programmazione come i principi S.O.L.I.D. I controller dovrebbero essere ridotti al minimo, con ciascuno dedicato a una singola responsabilit\u00e0, ossia una singola azione. Questo approccio migliora la manutenibilit\u00e0, la testabilit\u00e0 e la chiarezza del codice. Il rovescio della medaglia \u00e9 quella di avere molte pi\u00fa classi, ma pi\u00fa contenute, nel progetto. Per fare esempio, invece di avere un solo controller che gestisce l&#8217;<em>index<\/em>, l&#8217;<em>edit<\/em> e il <em>delete<\/em> di un&#8217;entit\u00e1, seguendo la regola del Single Action Controller avremo tre differenti classi con un solo metodo <em>invoke<\/em> per ognuna di esse.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"errore-comune-controller-troppo-grassi\">Errore Comune: Controller Troppo &#8220;Grassi&#8221;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Un errore comune \u00e8 avere controller che contengono troppa logica, come ad esempio:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gestione della validazione dei dati.<\/li>\n\n\n\n<li>Elaborazione di pi\u00f9 azioni in un singolo controller.<\/li>\n\n\n\n<li>Logica complessa che non ha a che fare direttamente con la coordinazione tra vista e modello.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Questo rende il controller difficile da comprendere, testare e manutenere. Se un controller gestisce troppe azioni o troppe responsabilit\u00e0, ogni cambiamento in una parte del codice potrebbe avere impatti imprevisti su altre funzionalit\u00e0.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"best-practices-single-action-controllers-e-solid\">Best Practices: Single Action Controllers e S.O.L.I.D.<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Adotta i Single Action Controllers<br>I Single Action Controllers seguono la filosofia che ogni controller dovrebbe occuparsi di una sola azione o di una singola responsabilit\u00e0. Questo approccio rende il controller molto focalizzato e semplice da gestire. L\u2019idea di base \u00e8 che ogni controller debba essere il punto di coordinamento per una specifica azione, come visualizzare un elemento, salvare un dato o modificare una risorsa.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Ogni controller dovrebbe essere creato per gestire solo un\u2019azione e passare i dati al modello o ad un servizio per compiere qualsiasi logica di business. La vista poi si occupa della presentazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esempio di un Single Action Controller:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class CreateEntityController \n{\n    public function __invoke(Request $request) \n    {\n        $validation = $request-&gt;validated();\n\n        $entity = EntityService::create($request-&gt;all());\n\n        return redirect()-&gt;route('entity.show', &#91;'id' =&gt; $entity-&gt;id]);\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In questo esempio, il controller \u00e8 dedicato solo alla creazione di una entit\u00e1, senza preoccuparsi di altre operazioni come la modifica o la visualizzazione. Ogni controller pu\u00f2 quindi essere pi\u00f9 facile da testare e modificare senza introdurre bug in altre aree dell\u2019applicazione.<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Utilizzare Servizi e Modelli per la Logica di Business<br>Per evitare che i controller diventino troppo complessi, la logica di business (come la creazione di un utente, la gestione dei pagamenti, ecc.) dovrebbe essere spostata in classi di servizio o modelli. Questi servizi o modelli si occupano della logica pesante, mentre i controller dovrebbero restare snelli, limitandosi a gestire il flusso delle informazioni e a coordinare le azioni.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Esempio di utilizzo di una classe di servizio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class EntityService \n{\n    public function create(array $data) \n    {\n        $entity = new EntityModel($data);\n        $entity-&gt;save();\n\n        return $entity;\n    }\n}\n\nclass CreateEntityController \n{\n    private $entityService;\n\n    public function __construct(EntityService $entityService) \n    {\n        $this-&gt;entityService = $entityService;\n    }\n\n    public function store(Request $request) \n    {\n        $validation = $request-&gt;validated();\n\n        $entity = $this-&gt;entityService-&gt;create($request-&gt;all());\n\n        return redirect()-&gt;route('entity.show', &#91;'id' =&gt; $entity-&gt;id]);\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In questo caso, la logica di creazione dell&#8217;utente \u00e8 delegata alla classe di servizio <em>EntityService<\/em>, mentre il controller \u00e8 responsabile solo di gestire la richiesta e reindirizzare l&#8217;utente a una nuova pagina.<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Vantaggi dei Single Action Controllers<br>Adottare i Single Action Controllers porta diversi vantaggi:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Testabilit\u00e0<\/strong>: Ogni controller \u00e8 responsabile di una sola azione, il che semplifica i test unitari. La logica complessa \u00e8 esterna al controller, quindi il test si concentra esclusivamente sul comportamento dell&#8217;azione.<\/li>\n\n\n\n<li><strong>Manutenibilit\u00e0<\/strong>: Un controller che gestisce una sola azione \u00e8 facile da comprendere e modificare. Aggiungere nuove funzionalit\u00e0 non significa modificare controller esistenti, ma solo crearne di nuovi.<\/li>\n\n\n\n<li><strong>Scalabilit\u00e0<\/strong>: Con i Single Action Controllers, \u00e8 facile estendere l\u2019applicazione aggiungendo nuovi controller senza compromettere la coesione o la chiarezza dell\u2019applicazione.<\/li>\n<\/ul>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Applicare i Principi S.O.L.I.D.<br>I <a href=\"https:\/\/blog.cleancoder.com\/uncle-bob\/2020\/10\/18\/Solid-Relevance.html\">principi S.O.L.I.D.<\/a> aiutano a mantenere il codice chiaro, modulare e facilmente estendibile. Questi principi sono fondamentali per garantire che i controller rimangano snelli e ben strutturati:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>S<\/strong>: Single Responsibility Principle (SRP): Ogni classe deve avere una sola responsabilit\u00e0. Nel caso dei controller, ogni controller deve essere concentrato su un\u2019unica azione e delegare tutto il resto ad altri componenti come servizi o modelli. Cos\u00ed come i controller, anche i servizi devono avere una singola responsabilit\u00e1.<\/li>\n\n\n\n<li><strong>O<\/strong>: Open\/Closed Principle (OCP): Le classi devono essere progettate per essere estensibili senza modificare il loro codice originale. \u00c8 possibile aggiungere nuove funzionalit\u00e1, ma non si deve mai modificare una classe esistente. Ad esempio, in molte situazioni si pu\u00f3 <a href=\"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/\">implementare lo Strategy Pattern<\/a>.<\/li>\n\n\n\n<li><strong>L<\/strong>: Liskov Substitution Principle (LSP): Le classi derivate devono essere sostituibili con la loro classe base senza alterare il comportamento dell\u2019applicazione.<\/li>\n\n\n\n<li><strong>I<\/strong>: Interface Segregation Principle (ISP): Le interfacce devono essere progettate per non obbligare le classi ad implementare metodi inutilizzati.<\/li>\n\n\n\n<li><strong>D<\/strong>: Dependency Inversion Principle (DIP): Le classi dovrebbero dipendere da interfacce astratte o classi di servizio, piuttosto che da classi concrete, per facilitare la testabilit\u00e0 e la manutenzione.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusione\">Conclusione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mantenere i controller leggeri e rispettare i principi dell&#8217;architettura MVC non \u00e8 solo una questione di stile: \u00e8 una necessit\u00e0 per costruire applicazioni PHP robuste, scalabili e facili da mantenere. Adottando i Single Action Controllers e delegando la logica di business a classi di servizio dedicate, puoi evitare che i tuoi controller diventino un &#8220;imbuto&#8221; che raccoglie tutte le responsabilit\u00e0, compromettendo la chiarezza e la testabilit\u00e0 del codice. Allo stesso modo, applicare i principi S.O.L.I.D. non solo migliora la qualit\u00e0 del codice, ma rende l&#8217;intero sistema pi\u00f9 agile e preparato per affrontare l&#8217;evoluzione futura.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ogni scelta che fai nell&#8217;architettura del tuo progetto influenzer\u00e0 la sua manutenibilit\u00e0 nel lungo periodo. Se impari a mantenere i controller focalizzati, a separare le responsabilit\u00e0 e a scrivere codice testabile fin dall&#8217;inizio, stai costruendo una base solida su cui potrai facilmente aggiungere nuove funzionalit\u00e0, risolvere bug e migliorare il sistema senza paura di compromettere l&#8217;intera applicazione. Non sottovalutare mai il potere di un&#8217;architettura ben progettata: \u00e8 la chiave per il successo di ogni progetto software.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A presto con la seconda parte di &#8220;Best Practices per l&#8217;Architettura MVC in PHP: Errori Comuni e Come Evitarli&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se ti \u00e9 piaciuto l&#8217;articolo, se hai imparato qualcosa o se pensi che qualcuno possa beneficiarne, sentiti libero di condividerlo sul tuo social preferito, cliccare 5 stelle o lasciare un commento per intavolare una discussione. Grazie!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo articolo esploreremo le Best Practices per l&#8217;Architettura MVC in PHP: quali sono gli errori pi\u00fa comuni e come evitarli. In particolare vedremo come mantenere i controller leggeri e rispettare i principi dell&#8217;architettura MVC.<\/p>\n","protected":false},"author":1,"featured_media":2578,"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":[88,87,41],"class_list":["post-2576","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mvc","category-php","category-programming","tag-best-practices","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>Best Practices per l&#039;Architettura MVC in PHP Part 1: I Controller- Giuseppe Maccario<\/title>\n<meta name=\"description\" content=\"In questo articolo esploreremo le Best Practices per l&#039;Architettura MVC in PHP: quali sono gli errori pi\u00fa comuni e come evitarli.\" \/>\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\/mvc-best-practices-errori-comuni-e-come-evitarli\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Best Practices per l&#039;Architettura MVC in PHP Part 1: I Controller- Giuseppe Maccario\" \/>\n<meta property=\"og:description\" content=\"In questo articolo esploreremo le Best Practices per l&#039;Architettura MVC in PHP: quali sono gli errori pi\u00fa comuni e come evitarli.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/\" \/>\n<meta property=\"og:site_name\" content=\"Giuseppe Maccario\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-09T17:30:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-09T17:54:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/\"},\"author\":{\"name\":\"giuseppemaccario\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"headline\":\"Best Practices per l&#8217;Architettura MVC in PHP: Errori Comuni e Come Evitarli &#8211; Part 1: I Controller\",\"datePublished\":\"2025-01-09T17:30:42+00:00\",\"dateModified\":\"2025-01-09T17:54:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/\"},\"wordCount\":2256,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"image\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg\",\"keywords\":[\"best practices\",\"mvc\",\"php\"],\"articleSection\":[\"mvc\",\"PHP\",\"Programming\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/\",\"name\":\"Best Practices per l'Architettura MVC in PHP Part 1: I Controller- Giuseppe Maccario\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg\",\"datePublished\":\"2025-01-09T17:30:42+00:00\",\"dateModified\":\"2025-01-09T17:54:04+00:00\",\"description\":\"In questo articolo esploreremo le Best Practices per l'Architettura MVC in PHP: quali sono gli errori pi\u00fa comuni e come evitarli.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg\",\"width\":2560,\"height\":1440,\"caption\":\"Best Practices per l'Architettura MVC in PHP: Errori Comuni e Come Evitarli - Part 1: I Controller\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/mvc-best-practices-errori-comuni-e-come-evitarli\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Best Practices per l&#8217;Architettura MVC in PHP: Errori Comuni e Come Evitarli &#8211; Part 1: I Controller\"}]},{\"@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":"Best Practices per l'Architettura MVC in PHP Part 1: I Controller- Giuseppe Maccario","description":"In questo articolo esploreremo le Best Practices per l'Architettura MVC in PHP: quali sono gli errori pi\u00fa comuni e come evitarli.","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\/mvc-best-practices-errori-comuni-e-come-evitarli\/","og_locale":"it_IT","og_type":"article","og_title":"Best Practices per l'Architettura MVC in PHP Part 1: I Controller- Giuseppe Maccario","og_description":"In questo articolo esploreremo le Best Practices per l'Architettura MVC in PHP: quali sono gli errori pi\u00fa comuni e come evitarli.","og_url":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/","og_site_name":"Giuseppe Maccario","article_published_time":"2025-01-09T17:30:42+00:00","article_modified_time":"2025-01-09T17:54:04+00:00","og_image":[{"width":2560,"height":1440,"url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg","type":"image\/jpeg"}],"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\/mvc-best-practices-errori-comuni-e-come-evitarli\/#article","isPartOf":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/"},"author":{"name":"giuseppemaccario","@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"headline":"Best Practices per l&#8217;Architettura MVC in PHP: Errori Comuni e Come Evitarli &#8211; Part 1: I Controller","datePublished":"2025-01-09T17:30:42+00:00","dateModified":"2025-01-09T17:54:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/"},"wordCount":2256,"commentCount":0,"publisher":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"image":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/#primaryimage"},"thumbnailUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg","keywords":["best practices","mvc","php"],"articleSection":["mvc","PHP","Programming"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/","url":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/","name":"Best Practices per l'Architettura MVC in PHP Part 1: I Controller- Giuseppe Maccario","isPartOf":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/#primaryimage"},"image":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/#primaryimage"},"thumbnailUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg","datePublished":"2025-01-09T17:30:42+00:00","dateModified":"2025-01-09T17:54:04+00:00","description":"In questo articolo esploreremo le Best Practices per l'Architettura MVC in PHP: quali sono gli errori pi\u00fa comuni e come evitarli.","breadcrumb":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/#primaryimage","url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg","contentUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/Best-Practices-per-lArchitettura-MVC-in-PHP-Errori-Comuni-e-Come-Evitarli-Part-1-I-Controller-pexels-googledeepmind-17483873-scaled.jpg","width":2560,"height":1440,"caption":"Best Practices per l'Architettura MVC in PHP: Errori Comuni e Come Evitarli - Part 1: I Controller"},{"@type":"BreadcrumbList","@id":"https:\/\/www.giuseppemaccario.com\/it\/mvc-best-practices-errori-comuni-e-come-evitarli\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.giuseppemaccario.com\/it\/"},{"@type":"ListItem","position":2,"name":"Best Practices per l&#8217;Architettura MVC in PHP: Errori Comuni e Come Evitarli &#8211; Part 1: I Controller"}]},{"@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\/2576","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=2576"}],"version-history":[{"count":12,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/2576\/revisions"}],"predecessor-version":[{"id":2590,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/2576\/revisions\/2590"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/media\/2578"}],"wp:attachment":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/media?parent=2576"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/categories?post=2576"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/tags?post=2576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}