26 articoli nella categoria Corso PHP 1
Andrea Pastore 27/09/2020 0
26. Messa in produzione di un progetto
Una volta finito il nostro progetto dobbiamo trasportarlo dal nostro computer al server dove risiederà e sarà fruibile al web. Il server dove risiede il progetto accessibile a tutti è definito server di produzione. Le operazioni più comuni sono il caricamento dei file l’importazione del database, ma può capitare in progetti avanzati di dover fare altre configurazioni.
Caricare file con il protocollo FTP
L’FTP è un protocollo per il trasferimento di dati pensato per caricare file da un computer ad uno spazio web. Per caricare i file del prodotto Geecom che si vuole utilizzare si deve usare un client FTP, ad esempio FileZilla, un programma gratuito scaricabile dal sito http://filezilla-project.org/.
Dopo aver lanciato il programma apparirà questa schermata:
Per caricare i file bisogna stabilire una connessione col sito, riempendo i campi in alto a sinistra del pulsante connessione rapida. Nel campo “Host” bisogna scrivere l'indirizzo del dominio acquistato senza “www.”; nel campo “Nome utente” il nome utente con cui si accede allo spazio web, nel campo “Password” la password per accedere al vostro spazio web. Il campo “Porta” va lasciato vuoto, in questo modo viene usata la porta predefinita.
A connessione avvenuta si possono caricare i file: la finestra a destra mostra le cartelle sul server, quella a sinistra le cartelle del nostro computer. Per portare il nostro progetto online dobbiamo andare nella cartella principale, selezionate tutti i file e trascinarli nella finestra di destra di FileZilla. Il tempo necessario per il caricamento dipende dal numero di file da scaricare.
Andrea Pastore 27/09/2020 0
25. Composer
Composer è un gestore di pacchetti per PHP. È nato nel 2015 e da allora si è imposto come lo standard per la gestione delle dipendenze.
Scaricare Composer
Per scaricare Composer visitare il sito https://getcomposer.org/ e a seconda del sistema operativo che avete avrete una diversa procedura di installazione.
Il file composer.json
Il file composer.json contiene tutte le dipendenze per gestire il nostro progetto. Quando dobbiamo utilizzare una libreria esterna ci basterà inserirla in questo file e automaticamente Composer la scaricherà per noi.
Esempio di composer.json :
{
"require": {
"monolog/monolog": "dev- master#2eb0c0978d290a1c45346a1955188929cb4e5db7",
"acme/foo": "1.0.x-dev#abc123"
},
"autoload": {
"psr-4": {
"Monolog\\": "src/",
"Vendor\\Namespace\\": ""
}
}
Andrea Pastore 27/09/2020 0
24. Comunicazione tra server: il mondo delle API
Nel mondo informatico è frequente la necessità di parlarsi tra sistemi diversi. Supponiamo ad esempio che due server della stessa azienda devono scambiarsi informazioni sugli utenti: per fare questa cosa bisognerà prevedere lo sviluppo di file appositi che si connetteranno all’altro server e comunicheranno queste informazioni. Ogni server deve avere anche dei file predisposti per ricevere queste informazioni. Questi file prendono il nome di API. Mentre altri file sul server si occuperanno ad esempio di mostrare i siti o fare altri processi, le API saranno sempre in ascolto ricevere informazioni da uno o più server esterni.
Comunicazione tra server: l’esigenza di una lingua comune
I server possono avere diverse tecnologie, ma questo non deve essere un ostacolo alla comunicazione. Sono state inventate diversi sistemi di interscambio di dati, i più comuni sono il JSON e l’XML.
JSON
JSON sta per JavaScript Object Notation ed è il formato di scambio dei dati più diffuso oggi. Un oggetto JSON inizia e termina con una parentesi graffa, gli elementi al suo interno vengono rappresentati mettendo il nome dell’elemento seguito dai due punti e poi dal valore. Il nome dell’elemento sarà messo tra virgolette, il valore sarà messo tra virgolette solo se è una stringa. Ad esempio:
“nome”:”Mario”
oppure nel caso di un valore numerico:
“età”:5
Nota: dopo ogni elemento (tranne l’ultimo) è necessario mettere una virgola.
Vediamo un esempio di oggetto JSON che contengono le informazioni di una persona:
{
“nome”:”Mario”,
“cognome”:”Rossi”,
“età”:5,
“email”:”mariorossi@virgilio.it”
}
Array in JSON
Il JSON ha la possibilità di raccogliere elementi dello stesso tipo in un array, proprio come la maggior parte dei linguaggi di programmazione. Proprio come nei principali linguaggi di programmazione l’array si crea con le parentesi quadre e al suo interno vanno inseriti gli elementi separati da una virgola. Supponiamo ad esempio di dover rappresentare in JSON un oggetto regione, contenente nome, popolazione, pil e una lista delle principali città. Il campo principali città può essere un array con vari elementi all’interno:
“principaliCitta”:[“Città 1”,“città 2”];
Un array può contenere anche oggetti. Pensando all’esempio di prima, supponiamo di voler rappresentare le città in maniera più accurata, indicando per ognuna nome, numero di abitanti e la provincia. L’esempio diventerebbe cosi:
“principaliCitta”:[
{
“nome”:”Firenze”,
“abitanti”:300000,
“provincia”:”FI”
},{
“nome”:”Prato”,
“abitanti”:15000,
“provincia”:”FI”
}],
Esistono dei siti che consentono di validare il JSON scritto, ad esempio:
https://jsonformatter.curiousconcept.com/
Manipolare oggetti JSON con PHP
PHP mette a disposizione delle funzioni che consentono creare e decodificare oggetti in formato JSON: si tratta delle funzioni json_encode e json_decode.
json_encode
Per creare oggetti JSON usiamo la funzione json_encode() che prende in input un array e restituisce un oggetto JSON. Tipicamente useremo questa funzione abbinata alla funzione echo, perché dopo aver creato l’oggetto JSON vorremmo stamparlo. Vediamo un esempio:
$utente = [
"nome" => "Mario",
"cognome" => "Rossi",
"email" => "mariorossi@gmail.com"
];
echo json_encode($utente);
i moderni browser possono formattare i dati JSON, basta indicare nell'header di pagina che si tratta di dati di questo tipo. Questo si fa con il seguente comando:
header('Content-Type: application/json');
json_decode
La funzione json_decode() serve per decodificare i dati JSON: prende in input una stringa e restituisce l'oggetto a cui possiamo accedere allo stesso modo in cui accediamo alle proprietà di una classe con variabili pubbliche. Vediamo un esempio:
$jsonTxt = '{
"nome" : "Mario",
"cognome" : "Rossi",
"email" : "mariorossi@gmail.com"
}';
$jsonObj = json_decode($jsonTxt);
// recupero le informazioni
$nome = $jsonObj->nome;
$cognome = $jsonObj->cognome;
echo "$nome $cognome";
SOAP
Il protocollo SOAP consente di scambiare informazioni tra componenti software utilizzando come fonte di scambio documenti scritti in XML (un metalinguaggio per la definizione di linguaggi di markup, come ad esempio HTML, ideato per consentire agli utenti di creare documenti con markup personalizzati). Era il protocollo di scambio standard prima dell’avvento del JSON, ma conserva una fetta non trascurabile di utilizzo.
Il file WSDL
Ogni web server ha un file WSDL che contiene la descrizione della sua interfaccia: i parametri necessari ad eseguire le varie operazioni, i messaggi di risposta e cosi via.
La classe SoapClient
PHP mette a disposizione la classe SoapClient per comunicare con i web server SOAP.
Il costruttore di questo dato prende in input un indirizzo web dove è specificato il file WSDL con le opzioni del web server.
$wsdl = “linkwsdldelserver.wsdl";
$soap = new SoapClient($wsdl);
Il metodo doRequest è quello che si occupa di eseguire la richiesta. Restituisce il responso del server, che dobbiamo mettere in una variabile:
$responso = $soap->__doRequest($wsdl, $location, $action, $version);
Nota: la risposta viene fornita nel formato stdObject, quindi per accedere ai dati dovremmo comportarci come quando recuperiamo i dati di un oggetto, ad esempio:
echo $responso->elemento
Andrea Pastore 27/09/2020 0
23. I namespace
Un namespace una collezione di nomi di entità, definite dal programmatore, omogeneamente usate in uno o più file sorgente. A partire da PHP 7 anche PHP supporta questo approccio, che ha lo scopo di evitare confusione ed equivoci nel caso siano necessarie molte entità con nomi simili, fornendo il modo di raggruppare i nomi per categorie.
Concettualmente un namespace è assimilabile alla struttura delle cartelle di un filesystem: dobbiamo dichiarare un’origine per il nostro namespace che corrisponde alla directory root, o al nome del disco su sistemi Windows, e possiamo inserire in maniera sequenziale una serie di suddivisioni che in questa similitudine rappresenterebbero le sottocartelle.
Vantaggi dei namespace
Il primo vantaggio è quello di organizzare il codice in modo da facilitare la manutenibilità, ad esempio tramite lo standard PSR-4;
non dobbiamo preoccuparci dei problemi relativi alle omonimie tra classi, ad esempio una classe con un nome molto comune come Connection non sarà più un problema.
Andrea Pastore 27/09/2020 0
22. I template in PHP
Con la programmazione ad oggetti abbiamo introdotto il paradigma MVC, che consiste nel tener separate la definizione degli oggetti, logiche di controllo e le viste. Un modo ottimale per gestire le viste consiste nell'utilizzo file HTML contenenti il markup dell’elemento, ma con dei valori segnaposto che vengono sostituiti di volta in volta. Questi file HTML vengono chiamati template. Ogni volta che dovrà essere stampato un elemento di quel tipo (si pensi ad esempio a degli articoli) il codice PHP prenderà il template, sostituirà i valori segnaposto con quelli reali ed eseguirà la stampa.
Il vantaggio di questo approccio è ancora una volta nella manutenzione del codice, perché il codice HTML sarà separato dal codice PHP e sarà possibile riutilizzarlo tutte le volte che serve.
Facciamo un esempio su come avviene la gestione: supponiamo di dover inserire in una pagina una serie di articoli. Il codice degli articoli sarà sempre uguale, cambieranno solo i contenuti. Quindi possiamo creare un file che chiameremo articolo.html fatto in questo modo:
<div class=”articolo” >
<h1> _titolo_ </h1>
<h2> _sottottitolo_ </h2>
<p> _testo_ </p>
</div>
possiamo poi creare una funzione PHP che recupera queste informazioni e sostituisce gli articoli ogni volta:
function renderizzaArticoli($titolo, $sottoTitolo,$testo) {
$codice = file_get_contents(“articolo.html”);
$codice = str_replace(“_titolo_”,$titolo);
$codice = str_replace(“_sottottitolo_”,$sottottitolo);
$codice = str_replace(“_testo_”,$testo);
echo $codice;
}
In questo modo il codice per recuperare gli articoli potrebbe essere:
$query = “SELECT * FROM articoli”;
if(!$risQuery = $db->query($query)) {
echo "Errore durante l'esecuzione della query: ".$db->error;
echo "<br>$query";
exit();
}
while($articolo = $risQuery→fetch_assoc()) {
renderizzaArticoli($articolo[“titolo”], $articolo[“sottoTitolo”],$articolo [“testo”]);
}
Creiamo una funzione più generalista
La funzione renderizzaArticoli vista sopra svolge il suo dovere per stampare gli articoli ma è troppo specializzata, possiamo usarla solo per questo compito. Questo approccio non è l’ideale, perché ci costringe a creare una funzione per ogni oggetto che dobbiamo renderizzare.
La soluzione migliore è costruire una funzione generalista, che non prenda parametri precisi ma un template e un array di parametri, che sostituisce di volta in volta:
function renderizza($template, $parametri) {
$codice = file_get_contents($template);
foreach($parametri as $etichetta => $valore) {
$ codice = str_replace("_$etichetta_",$valore,$codice);
}
echo $codice;
}
Possiamo quindi riscrivere il codice visto sopra in questo modo:
$query = “SELECT * FROM articoli”;
if(!$risQuery = $db->query($query)) {
echo "Errore durante l'esecuzione della query: ".$db->error;
echo "<br>$query";
exit();
}
while($articolo = $risQuery→fetch_assoc()) {
renderizza(“articolo.html”,array(“titolo”=>$articolo[“titolo”], ”sottoTitolo”=> $articolo[“sottoTitolo”], ”testo”=>$articolo [“testo”]));
}
In questo modo quando vorremmo utilizzare la stessa funzione per stampare altri tipi di elementi ci basterà cambiare il template HTML e i parametri dell’array. Un’altra ottimizzazione è quella di chiamare i campi della tabella e del template HTML allo stesso modo, in modo da passare direttamente l’array associativo ricavato dalla variabile $risQuery. Vediamo un esempio:
$query = “SELECT titolo, sottoTitolo, testo FROM articoli”;
if(!$risQuery = $db->query($query)) {
echo "Errore durante l'esecuzione della query: ".$db->error;
echo "<br>$query";
exit();
}
while($articolo = $risQuery→fetch_assoc()) {
renderizza(“articolo.html”,$articolo);
}