• Non ci sono risultati.

A seguito della progettazione si è passati all’implementazione vera e propria del bac-kend, iniziando dall’integrazione con Facebook.

5.2.1 Autenticazione con Facebook

Il Canvas Frame di Facebook altro non è che un iframe all’interno del quale viene visualizzata la propria applicazione. Esso però non si limita ad aprire la homepage del sito, ma invia una richiesta HTTP POST contenente la Signed Request. Essa, senza

33

entrare troppo nel dettaglio, consiste in una stringa, nella quale sono codificate una serie di informazioni per identificare l’utente attualmente autenticato, e un token che identifica la sessione all’interno del browser. Sfruttando però le librerie PHP SDK non è necessario conoscere in dettaglio il funzionamento della Signed Request, poichè queste librerie mettono a disposizione già dei metodi per dialogare con Facebook.

Si riporta un esempio di funzione per la creazione della sessione sfruttando la Signed Request inviata dal Canvas Frame:

1 public static function createFacebookSessionFromCanvas () { 2 $ helper = new FacebookCanvasLoginHelper ();

3 try {

4 $ facebookSession = $ helper-> getSession ();

5 } catch ( FacebookRequestException $ex) { 6 // W h e n F a c e b o o k r e t u r n s an e r r o r 7 echo $ex-> getMessage ();

8 return false ;

9 } catch (\ Exception $ex) {

10 // W h e n v a l i d a t i o n f a i l s or o t h e r l o c a l i s s u e s 11 echo $ex-> getMessage ();

12 return false ;

13 }

14 if(isset($ facebookSession)) {

15 // u s e r is l o g g e d in

16 }

17 // F a c e b o o k S e s s i o n is not v a l i d 18 return false ;

19 }

Codice 5.1: funzione di recupero sessione dal Canvas

Questa funzione restituisce un oggetto Facebook Session, necessario poi per richieste al social network, come ad esempio ottenere il profilo dell’utente o la lista dei suoi amici. In caso di errore vengono sollevate delle eccezioni.

L’estratto di codice seguente invece, a partire dall’oggetto sessione ottenuto dalla funzione soprastante, invia una richiesta al social network restituendo le informazioni dell’utente autenticato:

1 if(isset($ facebookSession)) {

2 $ requestU = new FacebookRequest (

3 $ facebookSession,

9 } catch ( FacebookAuthorizationException $ex) {

10 Self ::$ fb_Session = null ;

11 echo $ex-> getMessage ();

12 return null ;

13 }

14 $ userInfo = $ response-> getGraphObject ();

15 return $ userInfo;

16 }

17 else

18 return null ;

Codice 5.2: estratto richiesta informazioni utente da Facebook

5.2. IMPLEMENTAZIONE DEL BACKEND 35

Queste sono solo alcuni esempi di funzioni che sono state utilizzate per creare la clas-se FacaceFacebookSDK, la quale espone una interfaccia al resto dell’applicazione che permette di:

• creare la sessione Facebook a partire dalla Signed Request;

• controllare che la sessione sia ancora valida, che per questioni di sicurezza ha una durata limitata);

• ottenere le informazioni le informazioni dell’utente restituendo un oggetto FacebookUser, proprietario dell’applicazione;

• ottenere la lista degli amici dell’utente;

All’atto pratico ogni qual volta una pagina viene richiesta, il middleware

CheckFBAuthentication sfrutta i metodi esposti da FacaceFacebookSDK, per con-trollare che l’autenticazione sia andata a buon fine e permette alla richiesta di essere soddisfatta dal controller competente.

5.2.2 Model

Ogni model precedentemente progettato, per funzionare in Laravel, non necessita di al-cun metodo al suo interno. Infatti Eloquent ORM rende disponibili moltissime funzioni per operare con i dati contenuti nel database, dove ogni riga della tabella è rappresenta-ta da un oggetto e ogni colonna da un attributo. È possibile per esempio con il metodo all applicato sul model, ottenere una lista di oggetti che rappresentano i dati conte-nuti nella tabella. Eloquent ORM permette però di definire dei Query Scope statici o dinamici, per definire dei set comuni di condizioni, da poter riutilizzare successivamen-te nell’applicazione. Ad esempio, per recuperare i risultati di una specifica lista degli amici dell’utente autenticato, è stato definito il seguente Quesry Scope dinamico che, data in input la lista degli ID degli amici e l’ID di una lista, restituisce una tabella che associa utente amico e risultato.

1 public function scopeFriendResults ($query, $ friends, $ list_id) { 2 return $query-> whereIn (' facebook_id ', $ friends)

3 ->join (' facebook_user_lists ', 'user_id ', '=', 'id ') 4 ->where ('list_id ', '=', $ list_id)

5 -> orderBy ('result ', 'desc ');

6 }

Codice 5.3: query scope per ottenere i sisultati degli amici di una lista specifica Queste, insieme ad altre funzioni molto più banali, come per esempio controllare se l’utente è amministratore o una lista è stata pubblicata, hanno permesso poi una più agevole implementazione dei controller, evitando di inserire query all’interno di essi.

5.2.3 Controller

Il passo successivo allo sviluppo del model, è stata l’implementazione della gerarchia dei controller precedentemente progettata. Ogni controller è stato reso accessibile creando tre differenti rotte:

• /list_creation: per accedere alle pagine di creazione delle liste;

• /drawing_up: per accedere alle funzionalità di fruizione delle liste nell’applica-zione web;

• /: rootpath per la homepage e le pagine dei risultati degli amici.

Dopodiché per ognuno dei controller, osservabili in figura 4.10, sono state codificate le funzioni per rispondere alle possibili richieste provenienti dall’utente, attraverso l’inter-faccia grafica. In particolare in MainController, troviamo, all’interno del costruttore della classe, l’associazione al middleware FacebookCheck in modo che venga ereditato da tutta la gerarchia di classi sottostante.

Ogni funzione implementata all’interno di un controller in Laravel deve avere la seguente forma:

1 /* *

2 * R e s p o n d s to r e q u e s t s to GET / s h o w /1

3 */

4 public function getShow ($id)

5 {

6 //

7 }

Codice 5.4: esempio di funzione di un controller

La funzione getShow() dell’esempio, viene eseguita quando l’applicazione riceve una richiesta HTTP GET sulla URL /show, mentre la stessa funzione con parametri, ri-spenderà alla medesima richiesta, arricchita dallo stesso numero di parametri separati da uno “/”; Nell’esempio soprastante è presente un solo parametro id.

Si riporta ora una delle funzioni implementata all’interno del controller ListCreationController:

7 public function anyShow ($id) {

8 $ user = $this-> facadeFB -> getUser ();

9 $list = List:: find ($id);

10 $ elements = $list->elements() ->get ();

11 return view (" list_creation_views . show ", ['user ' => $user, 'list '

=> $list, 'elements ' => $ elements]);

12 }

Codice 5.5: funzione per visualizzare una specifica lista

Nel codice sopra, la funzione anyShow($id) permette di far visualizzare la lista con numero identificativo (ID) specificato nella URL. Viene innanzitutto recuperato l’u-tente autenticato attraverso la FacadeFacebookSDK (ogni controller ne possiede un puntatore), viene poi recuperata la lista dal database, corrispondente all’ID specificato e successivamente recuperati anche tutti i suoi elementi, con il metodo elements() (implementato nel model List). Nell’ultima istruzione il metodo view (un cosiddet-to helper di Laravel) crea la vista show, del package list_creation_views, con gli opportuni parametri, che specificano l’utente, la lista e gli elementi da visualizzare.

5.2. IMPLEMENTAZIONE DEL BACKEND 37

Ajax

Per garantire un’esperienza migliore all’utente nella fruizione dell’applicazione web, sono state implementate alcune azioni di gestione delle liste, come ad esempio la can-cellazione, fruttando Ajax. In Laravel l’utilizzo di Ajax è molto immediato, infatti la firma delle funzioni in un controller non cambia, sarà il framework ad occuparsi di tutto; unica differenza sta nel tipo di risposta data dalla funzione, che dovrà essere in formato json invece di produrre una nuova pagina web.

1 /* *

7 public function ajaxRequest ($id) { 8

9 // do s o m e t h i n g

10

11 return responce () ->json (['state ' => 'success ']);

12 }

Codice 5.6: funzione per visualizzare una specifica lista

Nel caso Javascript non funzionasse a dovere o fosse disattivato, renderebbe impos-sibile eseguire le operazioni di gestione delle liste, rese disponibili tramite Ajax. Si è dunque prevista nell’interfaccia Web e nei controller, la gestione delle sopracitate funzionalità anche attraverso classiche richieste HTTP, permettendo così un degrado elegante senza compromettere accessibilità e usabilità dell’applicazione.

Documenti correlati