In questa fase iniziale abbiamo separato la logica delle action del nostro e-commerce in file PHP separati per aiutarvi a comprendere il flusso dell’applicazione prima di effettuare lo switch al pattern MVC. In questo capitolo analizzeremo questi file.
Per i nostri scopi è utile richiamare alla memoria i contenuti del file .htaccess
usati fino ad ora.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?product/(.*?)/?$ /product.php?id=$1 [L]
RewriteRule ^/?add-to-cart/?$ /add-to-cart.php
RewriteRule ^/?cart/?$ /cart.php
RewriteRule ^/?checkout/?$ /checkout.php
RewriteRule ^/?payment/?$ /payment.php
RewriteRule ^/?thank-you/?$ /thank-you.php
RewriteRule ^/?cancel/?$ /cancel.php
Si tratta di redirect elementari che riscrivono il percorso fisico dei file PHP con percorsi canonici privi del nome del file. L’unica riscrittura complessa è la prima dove il parametro id
della query GET viene riscritto come /product/id
.
index.php
Questo file gestisce la home page del nostro sito che rappresenta anche la pagina principale dell’applicazione.
<?php
require_once('config.php');
require_once('classes/autoload.php');
session_start();
setlocale(LC_ALL, 'it_IT');
$shop = new Shop();
$shop->index();
?>
Viene caricato il file di configurazione dell’applicazione e incluse le classi principali del sito. Quindi viene inizializzata la sessione ed impostata la localizzazione delle stringhe in Italiano.
A questo punto viene invocato il metodo Shop::index()
della classe Shop
che gestisce l’applicazione.
product.php
Questo file gestisce la visualizzazione del dettaglio del singolo prodotto.
<?php
require_once('config.php');
require_once('classes/autoload.php');
session_start();
setlocale(LC_ALL, 'it_IT');
$shop = new Shop();
$shop->product();
?>
Anche qui viene invocato il metodo specifico della classe principale per gestire questo endpoint del sito. Come si può facilmente intuire, il metodo prende l’ID passato nella query GET e popola i dati di una view specifica dopo la query al database.
add-to-cart.php
Questo file gestisce l’aggiunta di un prodotto al carrello.
<?php
require_once('config.php');
require_once('classes/autoload.php');
session_start();
$shop = new Shop();
$shop->addToCart();
?>
cart.php
Questo file gestisce il carrello e le azioni correlate ( rimozione dei prodotti, aggiornamento della quantità, proseguire al checkout, continuare con gli acquisti).
<?php
require_once('config.php');
require_once('classes/autoload.php');
session_start();
setlocale(LC_ALL, 'it_IT');
$shop = new Shop();
$shop->cart();
?>
checkout.php
Questo file gestisce la cassa/checkout ed il pagamento tramite PayPal.
<?php
require_once('config.php');
require_once('classes/autoload.php');
session_start();
setlocale(LC_ALL, 'it_IT');
$shop = new Shop();
$shop->checkout();
?>
L’utente inserisce i suoi dati e quindi viene reindirizzato sul sito di PayPal per completare l’acquisto.
payment.php
Questo file gestisce le transazioni con PayPal, ossia la risposta che PayPal invia dopo aver reindirizzato il cliente dopo il pagamento.
<?php
require_once('config.php');
require_once('classes/autoload.php');
session_start();
setlocale(LC_ALL, 'it_IT');
$shop = new Shop();
$shop->payment();
?>
thank-you.php
Questo file conclude la procedura di acquisto cancellando la sessione, inviando un e-mail di conferma dell’ordine e visualizzando un messaggio di ringraziamento per l’utente.
<?php
require_once('config.php');
require_once('classes/autoload.php');
session_start();
setlocale(LC_ALL, 'it_IT');
$shop = new Shop();
$shop->thankYou();
?>
cancel.php
Questo file gestisce l’eventualità dell’annullamento del pagamento PayPal da parte dell’utente reindirizzando quest’ultimo alla pagina di checkout.
<?php
require_once('config.php');
require_once('classes/autoload.php');
session_start();
setlocale(LC_ALL, 'it_IT');
$shop = new Shop();
$shop->cancel();
?>
Problemi con questa soluzione
Sicuramente la ridondanza è il primo problema che appare evidente usando una soluzione basata su file multipli. Molte routine appaiono identiche su più file, rendendo la manutenzione e la scalabilità del codice un problema non indifferente.
Infatti se volessimo aggiungere un nuovo endpoint, non solo dovremmo creare una nuova action ma anche un nuovo file alla nostra struttura dopo aver creato un’altra regola nel file .htaccess
.
Fortunatamente, come vedremo, questi problemi verranno risolti dall’adozione del pattern MVC.