Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS

Pagina creata da Nicolo' Messina
 
CONTINUA A LEGGERE
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
Università degli Studi di Padova

                    Dipartimento di Matematica
              Corso di Laurea in Informatica

  Applicazione per la gestione di liste
        integrata con Facebook
                                 Tesi di Laurea

Relatrice
Prof.ssa Ombretta Gaggi
                                                             Laureando
                                                       Marco Michielotto

                          Anno Accademico: 2014-2015
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
Applicazione per la gestione di liste integrata con Facebook
         Marco Michielotto, Tesi di laurea, ©Ottobre 2015
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
Sommario

Il presente documento descrive il dettaglio dello stage formativo intrapreso dal lau-
reando Marco Michielotto presso l’azienda Noonic s.r.l., della durata di 320 ore. Lo
Stage aveva come obiettivo lo sviluppo di un applicativo Web per la gestione e la com-
pilazione di liste di elementi generici in una sorta di minigioco integrato con il social
network Facebook.
   Si andranno dunque a riassumere le attività svolte durante lo stage, con particolare
attenzione agli strumenti e alle tecnologie utilizzate.

                                           iii
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
Ringraziamenti

Vorrei innanzitutto ringraziare la professoressa Ombretta Gaggi, relatrice della mia te-
si, per la disponibilità e l’aiuto offertomi.

   Ringrazio inoltre tutto il team di Noonic s.r.l. ed in particolare il tutor aziendale
Sebastiano Favaro, per avermi accolto nel loro ufficio ed avermi sempre fatto sentire
come a casa e parte integrante del gruppo.

   Desidero poi ringraziare i miei genitori e mio fratello per avermi sostenuto ed aiu-
tato in questi intensi anni di studio, senza i quali non sarei mai giunto fin qui.

    Un sentito ringraziamento va a tutti i miei amici e compagni di università per i bel-
lissimi momenti passati assieme, per essermi stati vicini e avermi sopportato durante
questi anni di studi.

Padova, Ottobre 2015                                                 Marco Michielotto

                                           v
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
Indice

1 Introduzione                                                                                                                   1
  1.1 L’azienda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                              1
  1.2 Proposta di stage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                              1

2 Pianificazione                                                                                                                 3

3 Analisi dei Requisiti                                                                                                           5
  3.1 Casi d’uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                   .   .   .   .   .    5
      3.1.1 Caso d’uso UC 1.3: Gestione liste . . . . . . . . . . . .                                        .   .   .   .   .    7
      3.1.2 Caso d’uso UC 1.3.1: Creazione nuova lista . . . . . . .                                         .   .   .   .   .    8
      3.1.3 Caso d’uso UC 1.5: Compilazione nuova lista . . . . . .                                          .   .   .   .   .    9
      3.1.4 Caso d’uso UC 1.5.4: Visualizzazione risultato sintetico                                         .   .   .   .   .   10
  3.2 Elenco dei requisiti . . . . . . . . . . . . . . . . . . . . . . . .                                   .   .   .   .   .   11
      3.2.1 Requisiti Funzionali . . . . . . . . . . . . . . . . . . . .                                     .   .   .   .   .   11
      3.2.2 Requisiti qualitativi . . . . . . . . . . . . . . . . . . . .                                    .   .   .   .   .   13
      3.2.3 Requisiti dichiarativi . . . . . . . . . . . . . . . . . . .                                     .   .   .   .   .   14
  3.3 Resoconto . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                    .   .   .   .   .   14

4 Progettazione                                                                                                                  15
  4.1 Dominio applicativo . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
  4.2 Architettura generale . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   17
  4.3 Progettazione del Model . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
      4.3.1 Progettazione del Database           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
  4.4 Progettazione del Controller . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
      4.4.1 Routing . . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
      4.4.2 Architettura del Controller .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
      4.4.3 FacebookSDK . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      4.4.4 Middleware . . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
  4.5 Progettazione delle View . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
  4.6 Diagrammi delle attività . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
      4.6.1 Attività principale . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
      4.6.2 Compilazione di una lista .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
      4.6.3 Gestione liste . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
      4.6.4 Gestione risultati liste . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31

                                           vii
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
viii                                                                                                                 INDICE

5 Implementazione e testing                                                                                                  33
  5.1 Strumenti . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   33
  5.2 Implementazione del backend . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   33
      5.2.1 Autenticazione con Facebook          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   33
      5.2.2 Model . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   35
      5.2.3 Controller . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   35
  5.3 Implementazione dell’interfaccia . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38
      5.3.1 Autenticazione . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   40
      5.3.2 Homepage . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   42
      5.3.3 Compilazione Lista . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   43
      5.3.4 Creazione e gestione delle liste     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   45
  5.4 Metriche di progettazione e codifica .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   48
  5.5 Verifica e Validazione . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   48
      5.5.1 Test di verifica . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   48
      5.5.2 Test di validazione . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   49

6 Conclusioni                                                                                                                51
  6.1 Obiettivi raggiunti . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                          51
  6.2 Conoscenze acquisite . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           51

A Design Pattern utilizzati                                                                                                  53
  A.1 Model-View-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . .                                            53
  A.2 Facade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                         54

Glossario                                                                                                                    55

Bibliografia                                                                                                                 61
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
Capitolo 1

Introduzione

1.1    L’azienda
Noonic s.r.l. è una web agency e digital factory, fondata da tre giovani ragazzi nel
2012, che opera in Italia e in India. La sede legale si trova a Milano, l’ufficio operativo
a Padova e una sede di sviluppo a Trivandrum.
L’azienda si occupa di sviluppo di applicativi web e recentemente anche di applica-
zioni per smartphone, garandendo al cliente anche soluzioni di web marketing per il
raggiungimento degli obiettivi di business e comunicazione dell’azienda.

                               Figura 1.1: logo dell’azienda

1.2    Proposta di stage
Il progetto proposto dall’azienda riprende un’idea già sviluppata alcuni anni fa, che
riscontrò molto successo in Italia (più di 10 milioni di utilizzi). Consiste nel realizzare
un applicativo web, all’interno del quale l’utente si sottopone alla compilazione di alcu-
ne liste di elementi, dalle quali può scegliere gli elementi di proprio interesse (secondo
il tema per cui è stata creata la stessa lista).
    Ad esempio potrà esserci una lista di sport dalla quale l’utente potrà scegliere quali
ha praticato, oppure una lista di libri dove selezionare quelli letti e l’applicazione darà
la possibilità di condividere il risultato con gli amici. L’idea è dunque quella di un
mini gioco sociale all’interno del quale gli utenti condividono aspetti della loro vita

                                            1
Applicazione per la gestione di liste integrata con Facebook - Università degli Studi di Padova - SIAGAS
2                                                       CAPITOLO 1. INTRODUZIONE

semplicemente selezionando elementi da liste pre-create da altri utenti, rendendo così
minimo lo sforzo da parte del giocatore.
   L’applicazione è integrata con il social network Facebook, sfruttando il sistema
Canvas Frame.
   All’utente, dopo la compilazione di una lista viene presentato un risultato aggregato
contenente solo il numero di elementi selezionati come ad esempio: "Hai selezionato
15 sport su 63". Il risultato ottenuto potrà essere condiviso su Facebook invogliando
così gli amici dell’utente a vedere nel dettaglio quanto selezionato dall’utente e l’amico
stesso verrà invitato ad effettuare il questionario.
   La Web App prevede sia la funzionalità di compilazione delle liste, sia la possibilità,
da parte di qualsiasi utente, di crearne; questo rende meno gravoso il popolamento
della piattaforma agli sviluppatori della stessa. Infine dalla pagina di gestione del-
le liste create, l’utente può controllare quante volte è stata compilata ciascuna lista,
indicandone il livello di popolarità. Lo scopo principale era quello di sviluppare nuo-
vamente questo applicativo, sfruttando le nuove tecnologie disponibili, da immettere
sul mercato indiano, nel quale l’azienda è molto presente.
   L’applicazione è sviluppata in lingua inglese poiché una delle lingua ufficiali dell’in-
dia.
Capitolo 2

Pianificazione

Prima dell’inizio dello stage è stato redatto un piano di lavoro, proposto dall’azianda,
a cadenza settimanale che è stato ampiamente rispettato.

   • Prima settimana: Fase di studio delle tecnologie coinvolte: API di Facebook,
     Laravel, PHP, HTML, CSS, Javascript, MySQL;
   • Seconda settimana: Fase di studio parziale, inizio della fase di analisi, colle-
     zione dei requisiti ed inizio della stesura di un documento di analisi dei requisiti;
   • Terza Settimana: Fine della fase di analisi ed inizio della fase di realizzazione
     della specifica tecnica;
   • Quarta Settimana: Sviluppo del prodotto;
   • Quinta Settimana: Sviluppo del prodotto, fino al rilascio di una versione alpha;
   • Sesta Settimana: Fine dello sviluppo ed inizio della fase di test funzionali,
     rilascio di una versione beta;
   • Settima Settimana: Validazione ulteriore parte dell’azienda con relative corre-
     zioni, e messa online del progetto. (circa una versione di RC);
   • Ottava Settimana: Correzioni a seguito di bug presentati dagli utilizzatori,
     monitoraggio dell’utilizzo, miglioramenti a seguito della messa online, ulteriori
     potenziali sviluppi.

                                            3
4   CAPITOLO 2. PIANIFICAZIONE
Capitolo 3

Analisi dei Requisiti

In questo capitolo viene documentata l’attività di analisi dei requisiti del progetto
proposto.

3.1    Casi d’uso
Per favorire l’attività di estrazione dei requisiti, a seguito di una riunione con il tutor
interno, sono stati redatti dei casi d’uso, dai quali è stato possibile estrarre un numero
consistente di requisiti. Per ogni caso d’uso è stato redatto il rispettivo diagramma
seguendo le specifiche UML 2.0, accompagnato con una descrizione testuale, secondo
lo schema seguente:

  UC: Il nome del caso d’uso con un codice identificativo gerarchico;
   • Attori Principali: Gli attori coinvolti;
   • Precondizioni: La precondizione del caso d’uso;
   • Descrizione: La descrizione del caso d’uso;
   • Post-condizioni: La Post-condizione del caso d’uso;
   • Scenario Alternativo: L’eventuale caso d’uso alternativo.

Caso d’uso UC 1: Visione ad alto livello
   • Attori: utente, nuovo utente;
   • Precondizione: l’utente è autenticato su Facebook;
   • Descrizione: Al momento dell’apertura dell’app l’utente di Facebook ha la pos-
     sibilità, in stile gioco, di compilare delle liste tra quelle proposte e di gestire la
     creazione di nuove liste da sottoporre ad altri utenti. Inoltre nel caso l’utente
     provenga da un link della bacheca di Facebook ha la possibilità di visualizzare
     i risultati della persona che ha condiviso il risultato. Infine se l’utente ha già
     utilizzato l’app e dunque ha già compilato almeno una lista, potrà visualizzarne
     i risultati ottenuti;

                                            5
6                                              CAPITOLO 3. ANALISI DEI REQUISITI

                    Figura 3.1: Caso d’uso UC1: Visione ad alto livello

    • Post-condizione: l’utente ha selezionato l’operazione da eseguire;
    • Scenario alternativo: se l’utente richiede la visualizzazione dei risultati di un
      amico riguardo una lista che lui stesso non ha ancora compilato, viene esortato a
      sottoporsi ad essa tramite un messaggio di notifica.
3.1. CASI D’USO                                                                     7

3.1.1   Caso d’uso UC 1.3: Gestione liste

                    Figura 3.2: Caso d’uso UC 1.3: Gestione liste

  • Attori: utente, nuovo utente;
  • Precondizione: l’utente è autenticato su Facebook;
  • Descrizione: Il nuovo utente può solamente iniziare la procedura per crearne una
    nuova; mentre un utente che ha già utilizzato l’app potrà, se presente, modificare
    una lista già creata;
  • Post-condizione: l’utente procede con la compilazione, modifica o ripresa della
    creazione di una lista;
  • Scenario alternativo: se l’utente aveva lasciato in sospeso la creazione di una
    lista, avrà la possibilità di riprenderla.
8                                              CAPITOLO 3. ANALISI DEI REQUISITI

3.1.2   Caso d’uso UC 1.3.1: Creazione nuova lista

                  Figura 3.3: Caso d’uso UC 1.3.1: Creazione nuova lista

    • Attori: utente;
    • Precondizione: l’utente sta creando una nuova lista da poter sottoporre ad altri
      utenti di Facebook;
    • Descrizione: l’utente durante la procedura di creazione di una nuova lista ha
      la possibilità di inserire ordinatamente un titolo, un’immagine, una descrizione e
      infine gli elementi testuali che dovrà contenere;
    • Post-condizione: la lista è stata creata correttamente.
3.1. CASI D’USO                                                                         9

3.1.3   Caso d’uso UC 1.5: Compilazione nuova lista

                Figura 3.4: Caso d’uso UC 1.5: Compilazione nuova lista

  • Attori: utente;
  • Precondizione: l’utente vuole sottoporsi alla compilazione di una lista;
  • Descrizione: l’utente procede con la compilazione della lista selezionando gli
    elementi che ritiene di suo interesse (secondo il titolo e la descrizione della lista)
    e può sosparsi tra gruppi di elementi per favorirne la leggibilità. Infine l’utente
    può concludere la compilazione e vedrà visualizzato un risultato riassuntivo che
    potrà condividere nella bacheca di Facebook;
  • Postcondizione: l’utente ha compilato la lista desiderata.
10                                                CAPITOLO 3. ANALISI DEI REQUISITI

3.1.4     Caso d’uso UC 1.5.4: Visualizzazione risultato sintetico

              Figura 3.5: Caso d’uso UC 1.5.4: Visualizzazione risultato sintetico

     • Attori: utente;
     • Precondizione: l’utente ha concluso la compilazione di una lista;
     • Descrizione: viene data la possibilità all’utente di rivedere gli elementi che ha
       selezionato nella lista appena compilata, di sceglierne un’altra tra quelle proposte
       dall’applicazione a quale sottoporsi o di visualizzare i risultati che hanno ottenuto
       i suoi amici che si sono sottoposti alla medesima lista. Infine è possibile pubblicare
       i risultati ottenuti sulla propria bacheca di Facebook;
     • Postcondizione: l’utente ha selezionato l’operazione da eseguire.
3.2. ELENCO DEI REQUISITI                                                               11

3.2      Elenco dei requisiti
A seguito della stesura dei casi d’uso è stato possibile redigere la seguente lista di re-
quisiti. Ogni requisito deve essere classificato nella seguente maniera:
                                 R[rilevanza][tipo][codice]
dove:
   • rilevanza può assumere i seguenti valori:
          – 0. obbligatorio;
          – 1. desiderabile;
          – 2. facoltativo.
        Tale attributo dovrà essere rappresentato per mezzo del numero corrispondente.
   • tipo può assumere i seguenti valori:
          – F. funzionale;
          – Q. qualitativo;
          – D. dichiarativo.
        Tale attributo dovrà essere rappresentato dalla lettera corrispondente.
   • codice è univoco e identificativo del singolo requisito. Il codice viene inoltre
     usato per creare una gerarchia tra requisiti. Dato il requisito “A” questo sarà
     soddisfatto se e solo se tutti i suoi sotto-requisiti obbligatori saranno soddisfatti.
  Si elencano sotto tutti i requisiti individuati, suddivisi per tipologia.

3.2.1     Requisiti Funzionali

        Requisito    Rilevanza     Descrizione
          R0F1       Obbligatorio  L’applicazione web deve presentare in ho-
                                   mepage un elenco di liste, rappresentate da
                                   un’immagine ed un titolo, a cui l’utente può
                                   sottoporsi.
          R0F1.1     Obbligatorio  L’elenco delle liste deve essere un sottoinsie-
                                   me di quelle presenti nel sistema, scelte tra
                                   le più popolari o nuove, ma comunque non
                                   ancora utilizzate dall’utente.
          R2F1.2     Opzionale     La logica di visualizzazione delle liste in ho-
                                   mepage può essere cambiata dal pannello
                                   configurazione.
           R0F2      Obbligatorio  L’utente quando si sottopone ad una lista
                                   composta da n elementi, ha la possibilità di
                                   sceglierne un numero che va da zero a n.
                           Continua nella pagina successiva.
12                                         CAPITOLO 3. ANALISI DEI REQUISITI

                       Continua dalla pagina precedente.
     Requisito   Rilevanza     Descrizione
      R0F2.1     Obbligatorio  Ogni lista contiene un numero di elementi va-
                               riabile, ma limitato ad un massimo di 100.

      R0F2.2     Obbligatorio    Le liste sono presentate all’utente per pa-
                                 gine con 10 elementi ciascuna per garantire
                                 l’accessibilità.
     R0F2.2.1    Obbligatorio    Il numero di elementi per pagine è modifi-
                                 cabile tramite variabile di configurazione di
                                 Laravel.
      R0F2.3     Obbligatorio    Ogni lista è composta, oltre che da un insie-
                                 me di elementi, da un titolo ed un’immagine.

      R0F2.4     Obbligatorio  Quando l’utente termina la compilazione
                               di una lista verrà visualizzato un risultato
                               aggregato.
      R0F2.5     Obbligatorio  Quando l’utente termina la compilazione di
                               una lista potrà visualizzare i risultati aggre-
                               gati e dettagliati degli amici Facebook che
                               hanno compilato la stessa.
       R0F3      Obbligatorio  L’utente può visualizzare i risultati dettaglia-
                               ti di utenti Facebook solamente se ha già
                               compilato la lista corrispondente.
      R0F3.1     Obbligatorio  Nel caso l’utente cercasse di visualizzare i ri-
                               sultati di un utente Facebook circa una lista
                               che non ha ancora compilato, una notifica lo
                               esorterà a sottoporsi a quest’ultima.
       R0F4      Obbligatorio  Gli utenti dell’applicazione possono gestire
                               la creazione di nuove liste da pubblicare e
                               sottoporre ad altri utenti.
      R0F4.1     Obbligatorio  L’utente può creare nuove liste inserendo un
                               titolo, un’immagine e una lista di elementi.
     R0P4.1.1    Obbligatorio  Le pagine di creazione delle liste sono in real-
                               tà un’unica pagina dinamica gestita tramite
                               Javascript per ridurre il carico lato server.
     R2F4.1.2    Opzionale     L’inserimento delle immagini è gestito con
                               una ricerca in Google immagini.
      R1F4.2     Desiderabile  L’utente ha la possibilità di modificare una
                               lista creata, ma la modifica non altererà in
                               alcun modo i risultati degli utenti che l’hanno
                               già compilata.
                       Continua nella pagina successiva.
3.2. ELENCO DEI REQUISITI                                                               13

                          Continua dalla pagina precedente.
        Requisito   Rilevanza     Descrizione
         R1F4.3     Desiderabile  L’utente può abbandonare e riprendere la
                                  creazione di una nuova lista.
         R0F4.4     Obbligatorio  La funzionalità di gestione della liste è ac-
                                  cessibile da ogni pagina dell’applicazione.

          R0F5      Obbligatorio    L’utente ha la possibilità di conoscere i ri-
                                    sultati dettagliati, e quindi quali elementi ha
                                    selezionato, di tutte le liste che ha compilato.

         R0F5.1     Obbligatorio    Assieme ai risultati è possibile visualizzare le
                                    statistiche di tutti gli utenti in percentuale
                                    per ogni elemento suddivise per sesso.
          R0F6      Obbligatorio    L’applicazione deve tracciare tutti i dati
                                    che Facebook, di base, mette a disposizione
                                    quando l’utente accetta di utilizzare l’App, in
                                    particolare l’età (o un suo range), l’indirizzo
                                    e-mail, il sesso e in più la lista degli amici.
          R0F7      Obbligatorio    Il sistema deve tenere traccia del numero di
                                    utenti che si sono sottoposti ad ogni lista.
          R0F8      Obbligatorio    L’utente può condividere il risultato ottenu-
                                    to dalla compilazione della lista sulla propria
                                    bacheca di Facebook.
         R0F8.1     Obbligatorio    Il post in bacheca deve contenere l’immagine,
                                    il risultato della lista e un link per visualiz-
                                    zarne il risultato all’interno dell’applicazione.

          R1F9      Desiderabile    Gli utenti con permessi di amministrazione
                                    possono visualizzare la lista di tutti i test
                                    ordinata per utilizzo.
         R1F9.1     Desiderabile    Per ogni lista sono disponibili le statistiche
                                    del tasso di abbandono e la lista di utenti
                                    che l’hanno compilata.
         R2D14      Opzionale       Il sistema prevede un pannello di configu-
                                    razione accessibile al di fuori di Facebook
                                    tramite autenticazione.
                       Tabella 3.1: Tabella requisiti funzionali

3.2.2    Requisiti qualitativi

Nessun requisito qualitativo è stato individuato.
14                                               CAPITOLO 3. ANALISI DEI REQUISITI

3.2.3    Requisiti dichiarativi

        Requisito    Rilevanza      Descrizione
         R0D10       Obbligatorio   L’applicazione sarà in lingua inglese.
         R0D11       Obbligatorio   L’applicazione deve essere integrata in Face-
                                    book, quindi sfruttare le API che il social net-
                                    work mette a disposizione e sarà visualizzata
                                    all’interno del Canvas Frame di Facebook.
         R0D12       Obbligatorio   La parte server side dell’applicazione deve
                                    essere sviluppata utilizzando il framework
                                    Laravel 5.0 ed il linguaggio PHP 5.4.
         R0D13       Obbligatorio   L’interfaccia web deve utilizzare le tecnologie
                                    HTML5, CSS3 e Javascript.
                       Tabella 3.2: Tabella requisiti dichiarativi

3.3     Resoconto
In totale sono stati individuati 32 requisiti suddivisi tra tipologia e rilevanza nel modo
seguente:

  Figura 3.6: suddivisione requisiti per tipologia   Figura 3.7: suddivisione requisiti per rilevanza
Capitolo 4

Progettazione

Il capitolo presenta le tecnologie utilizzate per lo sviluppo dell’applicazione ed il riepi-
logo della progettazione dell’architettura generale.

4.1    Dominio applicativo
In questa sezione vengono presentate le tecnologie utilizzate per lo sviluppo dell’ap-
plicazione. Il linguaggio utilizzato per il progetto è PHP, in particolare la versione
5.5, ampiamente utilizzato durante il corso di studi, anche se mai utilizzato nella
programmazione ad oggetti, era abbastanza conosciuto.

Framework Laravel
L’applicazione è stata sviluppata utilizzando Laravel versione 5.0, un framework svi-
luppato in linguaggio PHP. L’utilizzo di questo framework è stato consigliato da parte
dell’azienda e ben si adattava alla natura del progetto proposto di applicazione web ad
elevata dinamicità.
   Lo strumento era totalmente sconosciuto, ma lo studente aveva già avuto modo di
lavorare con un framework PHP durante il corso di Ingegneria del Software, dunque lo
studio è stato meno impegnativo.

                             Figura 4.1: Design pattern MVC

                                            15
16                                                   CAPITOLO 4. PROGETTAZIONE

MySQL
Per la gestione dei dati consistenti dell’applicazione il proponente ha imposto l’utilizzo
di un database di tipo MySQL che si interfaccia con il modulo Eloquent ORM di
Laravel. La tecnologia era già ben conosciuta da parte dello studente, grazie a quanto
appreso durante il corso di studi.

                                 Figura 4.2: logo MySQL

Facebook API
L’integrazione dell’applicazione avviene tramite le API ufficiali di Facebook, le quali,
essendo mal documentate, hanno costretto la perdita di alcune ore di studio aggiuntive,
per testare e capire al meglio il loro funzionamento.

                              Figura 4.3: logo facebook API

Bootstrap
Prima di progettare l’interfaccia grafica dell’applicazione è stato necessario decidere,
dopo aver scartato l’idea di scrivere a mano tutto il codice CSS, quale framework
utilizzare per velocizzare l’attività di sviluppo del front-end. Come consigliato anche
dalla comunity di Laravel, l’attenzione è ricaduta sul framework Bootstrap, il quale
ha facilitato la creazione di un interfaccia responsive e accessibile. Per il progetto è
stata utilizzata la versione 3 del suddetto framework, l’ultima disponibile al momento
dello scelta.
4.2. ARCHITETTURA GENERALE                                                               17

                                Figura 4.4: logo Bootstrap

Javascript
Linguaggio già ben noto grazie al corso di studi, Javascript è stato utilizzato in
particolare per alleggerire il carico del server nella paginazione e nella compilazione dei
form, sfruttando la tecnologia Ajax e le librerie JQuery.

 Figura 4.5: logo Javascript      Figura 4.6: logo Ajax        Figura 4.7: logo jQuery

4.2    Architettura generale
Nel progettare l’architettura software si è seguito un approccio di tipo top-down, de-
scrivendo in un primo momento le componenti ad un alto livello di astrazione, per poi
scendere nel dettaglio. Il framework Laravel possiede una propria architettura strut-
turata secondo il design pattern MVC e questo a forzato l’utilizzo dello stesso anche
nella modellazione dell’architettura dell’applicazione. Le principali conponenti ad alto
livello sono:
   • Model: contenente le classi che rappresentano rispettivamente le tabelle all’in-
     terno del database, mappate dalle librerie di Eloquent ORM;
   • View: insieme di file contenenti codice HTML e Template Blade che rappre-
     sentano le pagine visualizzate all’utente;
   • Controller: classi contenenti la logica dell’applicazione.
18                                                    CAPITOLO 4. PROGETTAZIONE

4.3      Progettazione del Model
Per la progettazione del Model si sono identificate le entità che contenessero i dati
dell’applicazione nelle seguenti:
     • FacebookUser: che rappresenta il singolo utente registrato all’interno del social
       network Facebook che utilizza l’applicazione;
     • List: entità rappresentate la lista compilabile dagli utenti che contiene una serie
       di elementi selezionabili;
     • ListElement: elemento di una lista;
     • FacebbokUserList: rappresenta il risultato ottenuto da un utente dopo aver
       compilato una lista.
     • Gui: modulo contenente le configurazioni riguardanti la grafica dell’applicazione,
       come ad esempio il numero di elementi per pagina durante la fruizione di una
       lista.
   La componente FacebookUserList del Model, come si potrebbe pensare, sembrereb-
be non aggiungere nulla in più rispetto ad una relazione molti a molti fra FacebookUser
e ListElement. Ma come espressamente richiesto dal proponente dell’azienda, si vuole
mantenere il risultato, ottenuto dalla compilazione di una lista, salvato nel database
senza doverlo ogni volta calcolare per questioni di efficienza.
   Dunque a discapito di una buona architettura si è scelto di aggiungere una classe in
più al Model, contenete queste informazioni.
   In figura 4.8 sono rappresentate le componenti del Model e le rispettive relazioni.

            Figura 4.8: Diagramma dell’architettura del model in Eloquent ORM
4.3. PROGETTAZIONE DEL MODEL                                                                   19

4.3.1     Progettazione del Database
Viene ora presentata la struttura del database che mantiene la persistenza dei dati
dell’applicazione. Ogni componente del Model è stata tradotta in una tabella all’interno
del database e le relazioni molti a molti ( in questo caso una soltatnto) sono state
implementate aggiungendo una tabella ulteriore contenente le chiavi primarie delle
due tabelle facenti parte della relazione.
   Il database è stato creato con lo Schema Builder di Laravel, che fornisce un mo-
do molto comodo di creare, modificare ed eliminare le tabelle del proprio database,
indipendentemente dal sistema usato. Laravel inoltre mette a disposizione una sorta
di version control del database detto Migration. Esso, tramite comandi da terminale,
permette di avviare delle procedure definite utilizzando lo Schema Builder, per creare
o modificare il database molto agevolmente.
   Si riporta un esempio di migration, utilizzata per la creazione della tabella FacebookUser,
dove si può vedere come con la sola invocazione di due metodi statici della classe
Schema, è possibile creare le tabelle all’interno del database, indipendentemente dalla
tecnologia utilizzata.
 1   class C re a t eF a c eb o o kU s e rs T a bl e extends Migration {
 2       /* *
 3         * Run the migrations .
 4         *
 5         * @return void
 6         */
 7       public function up ()
 8       {
 9            Schema :: create ( ' facebook_users ' , function ( Blueprint $ table )
10            {
11                   $ table - > increments ( ' id ') ;
12                   $ table - > bigInteger ( ' facebook_id ') -> unsigned () -> unique () ;
13                   $ table - > string ( ' name ') ;
14                   $ table - > string ( ' first_name ') ;
15                   $ table - > string ( ' link ') ;
16                   $ table - > string ( ' locale ') ;
17                   $ table - > string ( ' email ') ;
18                   $ table - > string ( ' gender ') ;
19                   $ table - > integer ( ' admin ') -> default ( 0 ) ;
20                   $ table - > boolean ( ' has_created ') ;
21                   $ table - > timestamps () ;
22            }) ;
23       }
24
25        /* *
26          * Reverse the migrations .
27          *
28          * @return void
29          */
30        public function down ()
31        {
32             Schema :: drop ( ' facebook_users ') ;
33        }
34   }

           Codice 4.1: classe migration per la creazione della tabella facebook_users
20                                                    CAPITOLO 4. PROGETTAZIONE

     Di seguito viene mostrato lo schema del database così ottenuto.

                    Figura 4.9: Diagramma dell’architettura del database
4.4. PROGETTAZIONE DEL CONTROLLER                                                          21

4.4     Progettazione del Controller
Dopo aver definito le componenti del Model si è potuto procedere con la definizione
dell’architettura del controller.

4.4.1    Routing
In Laravel le richieste HTTP che provengono dall’esterno, vengono gestite e instradate
attraverso un sistema di routing. Esso permette di rispondere alle richieste esterne
dell’utente con la pagina WEB corretta. Consente infatti di definire il comportamen-
to dell’applicazione che si sta sviluppando, semplicemente associando una URI (cioè
un indirizzo Web, un file, un servizio, ecc.) ad una determinata funzione o Closure,
all’interno della quale lo sviluppatore inserisce l’azione corrisponde.
    Un esempio di route in Laravel che visualizza la stringa “Hello world” alla richiesta
dell’utente della URL base del sito:
1   Route :: get ( '/ ' , function ()
2   {
3        return ' Hello ␣ World ';
4   }) ;

                                  Codice 4.2: esempio di route

   Una possibilità è quella di inserire tutta la logica dell’applicazione all’interno del file
route.php (contente le rotte) oppure di suddividerla utilizzando i controller. Essi sono
delle classi messe a disposizione dal framework, per strutturare al meglio il compor-
tamento del sito e, in caso di applicazione molto elaborata, permettere di creare una
buona architettura della logica.
   Nell’applicazione sviluppata è stato gestito a livello di routing solamente l’instrada-
mento delle richieste ai vari controller, che si occuperanno di gestire il comportamento
generale del sito. Questo ha permesso progettare una gerarchia di classi controller in
modo da suddividere la logica del sito per macro-funzionalità e rendere il codice più
mantenibile.

4.4.2    Architettura del Controller
Nella progettazione dell’architettura del controller si è cercato di creare un compo-
nente per ogni funzionalità offerta dall’applicazione. Innanzi tutto una super classe
MainController, che eredita dalla classe Controller di Laravel, contiene il controllo
dell’autenticazione con il social network Facebook; da essa ereditano le seguenti classi:

    • HomeController: si occupa della gestione della homepage e della visualizzazione
      della pagina dei risultati ottenuti da un amico dell’utente (cioè la pagina che
      verrà visualizzata nel momento in cui un utente clicca su un link all’interno della
      propria bacheca);

    • ListCreationController: contiene le funzioni che permettono la creazione di
      nuove liste e la loro gestione (modifica e cancellazione);
22                                                     CAPITOLO 4. PROGETTAZIONE

     • ListDrwaingUpController: controller che si occupa della compilazione delle liste
       da parte degli utenti e della visualizzazione del risultato prima della condivisione
       in bacheca.
     Si riporta la gerarchia appena esposta:

                   Figura 4.10: Diagramma dell’architettura del Controller
4.4. PROGETTAZIONE DEL CONTROLLER                                                      23

4.4.3    FacebookSDK
L’applicazione web sviluppata doveva essere inserita all’interno del Canvas Frame di
Facebook e dunque necessitava di interfacciarsi con esso attraverso le API che espone.
Il problema nasce da come queste API cambino anche a distanza di pochi mesi. Per
questo si è pensato di creare una classe FacadeFacebookSDK che, sfruttando il Design
Pattern Facade, esponesse all’applicazione alcuni metodi necessari al suo funziona-
mento, nascondendo al suo interno le chiamate ai metodi effettivi delle Facebook API.
E stato garantito così un basso accoppiamento e un codice più pulito.

4.4.4    Middleware
Una novità introdotta in Laravel dalla versione 5.0 sono i middleware, un meccanismo
creato per il filtraggio delle richieste HTTP. Ad esempio vengono utilizzati per il con-
trollo dell’autenticazione dell’utente che, in caso non fosse correttamente autenticato,
verrebbe reindirizzato alla pagina di login. Questo meccanismo permette di eseguire
questo controllo alla richiesta di ogni pagina prima ancora di eseguire la corrispondente
funzione del controller e quindi di non eseguire il controllo direttamente nel codice di
quest’ultimo.
   Nel caso specifico dell’applicazione è stato creato un middleware FacebookCheck che
controlla la corretta autenticazione dell’utente all’interno del social network. Facebook-
Check in caso di errore reindirizzerà l’utente all’interno del Canvas Frame di Facebook.
Infatti poiché l’applicazione è stata pensata per funzionare solamente all’interno del
Canvas Frame di Facebook, la mancata autenticazione indicherà una situazione di
errore o di accesso esterno dall’esterno del social network.
 1   class AgeMiddleware {
 2       public function handle ( $ request , Closure $ next )
 3       {
 4           if ( $ request - > input ( ' age ') < 2 0 )
 5           {
 6                return redirect ( ' home ') ;
 7           }
 8           return $ next ( $ request ) ;
 9       }
10   }
11
12   class MainController extends Controller {
13
14       /* *
15         * MainController instance .
16         */
17       public function __construct ()
18       {
19            $ this - > middleware ( ' ageMiddleware ') ;
20       }
21   }

                              Codice 4.3: esempio di Middleware

   Nell’esempio si può vedere come nella prima classe viene definito un middleware,
che nel caso in cui il parametro “age” fosse inferiore a 20, reindirizza la richiesta alla
pagina “home”, altrimenti permette alla richiesta di proseguire. Per associare questo
24                                                     CAPITOLO 4. PROGETTAZIONE

middleware al controller MainController basta richiamare all’interno del costruttore
di quest’ultimo il metodo middleware passando come unico parametro il nome del
middleware appena creato.

4.5      Progettazione delle View
Per la creazione delle viste, Laravel include out of the box Blade. Esso è un template
engine molto semplice ma anche molto potente, che permette la creazione di template
che ne estendono altri, così da rendere il codice più pulito, mantenibile e riutilizzabile.
Nonostante le sue svariate funzionalità, Blade non impedisce l’utilizzo di PHP vero e
proprio nel codice. Tutte le view vengono compilate e messe in cache per poi essere
ri-compilate in caso di modifiche, il che garantisce un overhead di Blade praticamen-
te prossimo allo zero. Tutti i file per essere riconosciuti da Blade devono avere un
estensione del tipo file.blade.php.
    Nella figura 4.11 è possibile vedere la struttura dell’architettura generale delle view.

Package layout
Questo package raggruppa tutti i template responsabili dell’aspetto grafico, comuni a
tutte o più di una pagina del sito:
     • main_layout.blade: file contenete la struttura base delle pagine dell’applicati-
       vo come l’inclusione dei fogli di stile, script Javascript ed il layout della barra
       superiore;
     • top_bar.blade: template contenente il codice per la grafica della top bar del sito;
     • friend_layout.blade: questo file viene utilizzato da results.blade per visua-
       lizzare, sotto ai risultati dell’utente della lista appena compilata, gli esiti della
       stessa di alcuni amici dell’utente stesso;
     • other_lists.blade: come per il precedente template, viene utilizzato da results.blade
       per proporre all’utente altre liste a cui sottoporsi;
     • footer.blade: file contenente il layout della barra inferiore di ogni pagina.

Package list_drawing_up_views
In questo package sono racchiusi i template delle pagine riguardanti la compilazione di
una lista, cioè dunque l’atto dell’utente di selezione degli elementi in essa contenuti e
la conseguente visualizzazione del risultato ottenuto:
     • drawing_up.blade: template della pagina di selezione degli elementi di una
       determinata lista;
     • results.blade: pagina di visualizzazione del risultato aggregato dopo la com-
       pilazione di una lista (viene utilizzato questo template anche per visualizzare il
       risultato di un amico);
4.5. PROGETTAZIONE DELLE VIEW                                      25

             Figura 4.11: Diagramma dell’architettura delle View
26                                                      CAPITOLO 4. PROGETTAZIONE

     • details.blade: pagina che mostra in dettaglio gli elementi che l’utente ha
       selezionato (viene utilizzato questo template anche per visualizzare il risultato
       dettagliata di un amico);
     • all_list _results.blade: template per mostrare tutte le liste a cui l’utente si
       è sottoposto e il relativo risultato.

Package list_creation_views
La grafica della funzionalità di creazione e gestione delle liste è contenuta in questo
package così strutturato:
     • manage.blade: template della pagina di gestione delle liste, e dunque di visualiz-
       zazione dell’elenco delle liste, create dall’utente autenticato, con le relative stati-
       stiche (nel caso di un utente con privilegi di amministratore, verranno visualizzate
       tutte le liste presenti nella piattaforma).
     • create.blade: pagina che offre all’utente una procedura di creazione di una
       nuova lista;
     • update.blade: permette all’utente autenticato la modifica di una lista creata
       dallo stesso;
     • show.blade: visualizza un’anteprima della lista selezionata;
     • show_items.blade: pagina di visualizzazione degli elementi che compongono la
       lista che l’utente sta visualizzando.
   Infine, al di fuori dei package appena elencati, vi sono due classi template: una
index.blade che si occupa della visualizzazione della homepage dell’applicazione web,
visualizzando un insieme di liste da proporre all’utente, secondo una logica selezionabile
nella configurazione; la seconda facebook_authentication.blade contiene uno script
Javascript, responsabile della comparsa del pop-up di Facebook, con il quale l’utente
accetta l’invio delle proprie informazioni all’applicazione.

4.6      Diagrammi delle attività
I diagrammi delle attività illustrati di seguito, descrivono le interazioni tra l’utente ed
l’applicazione. Essi sono stati definiti durante le attività di progettazione dell’archi-
tettura, per mostrare che il prodotto integrasse tutte le funzionalità richieste.

4.6.1     Attività principale
Una volta aperta l’applicazione l’utente visualizza l’homepage dalla quale ha la possi-
bilità di:
     • scegliere una lista e iniziare di conseguenza la sua compilazione;
     • visualizzare tutti i propri risultati ottenuti da precedenti compilazioni;
4.6. DIAGRAMMI DELLE ATTIVITÀ                                            27

           Figura 4.12: Diagramma delle attività - Attività principale
28                                                      CAPITOLO 4. PROGETTAZIONE

     • gestire le proprie liste;
     • tornare alla homepage mentre sta visualizzando altre pagine.

4.6.2     Compilazione di una lista

               Figura 4.13: Diagramma delle attività - Compilazione di una lista

   Dopo che l’utente ha scelto di compilare una lista e cioè scegliere quali elementi
selezionare all’interno di essa può:
     • visualizzare gli elementi in gruppi di 10 e selezionarne alcuni, tutti o nessuno;
4.6. DIAGRAMMI DELLE ATTIVITÀ                                                       29

  • visualizzare il risultato sintetico (del tipo “Hai selezionato x elementi su y”) al
    termine della compilazione;
  • decidere ora se:
      – selezionare un’altra lista a cui sottoporsi;
      – condividere il risultato con un amico;
      – visualizzare i propri risultati in maniera dettagliata (cioè quali elementi ha
        appena selezionato);
      – visualizzare il risultato aggregato e dettagliato di un amico che ha compilato
        la medesima lista.
30                                                      CAPITOLO 4. PROGETTAZIONE

4.6.3     Gestione liste

                    Figura 4.14: Diagramma delle attività - Gestione liste

     Una volta entrato nella gestione delle proprie liste, l’utente può:
     • selezionare una lista e modificarla o, nel caso non avesse concluso la creazione
       della stessa, riprendere l’operazione da dove aveva abbandonato;
     • creare una nuova lista da pubblicare nella piattaforma.
4.6. DIAGRAMMI DELLE ATTIVITÀ                                                               31

4.6.4   Gestione risultati liste

               Figura 4.15: Diagramma delle attività - Gestione risultati liste

   Nella visualizzazione dei risultati di tutte le liste l’utente ha la possibilità di selezio-
nare una determinata lista, ovviamente tra quelle che ha già compilato, e visualizzarne
prima il risultato sintetico e successivamente quello dettagliato.
32   CAPITOLO 4. PROGETTAZIONE
Capitolo 5

Implementazione e testing

In questo capitolo vengono descritte le attività di codifica dell’applicazione, a seguito
della terminazione della progettazione architetturale.

5.1     Strumenti
Per implementare questa applicazione web, era necessario scegliere quale IDE utilizzare
tra i tanti esistenti. In passato lo studente aveva utilizzato ad esempio NetBeans, poiché
uno degli IDE più completi tra quelli free, ma non era stato abbastanza soddisfacente.
L’attenzione è dunque ricaduta su PHPStorm, come consigliato dalla comunity di
Laravel, strumento questo specifico per i linguaggi PHP, HTML e Javascript. Consente
l’analisi del codice al volo, la prevenzioni degli errori, l’auto-completamento e dispone
di molte altre funzionalità interessanti. Unico punto a sfavore è che si tratta di un
software a pagamento, ma per fortuna è possibile ottenere una licenza free limitata per
gli studenti.
    La versione utilizzata durante lo stage è PHPStorm 8.0.3.

                              Figura 5.1: logo di PHPStorm

5.2     Implementazione del backend
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
34                                                   CAPITOLO 5. IMPLEMENTAZIONE E TESTING

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 c r e a t e F a c e b o o k S e s s i o n F r o m C a n v a s () {
 2           $ helper = new F a c e b o o k C a n va s L o g i n H e l pe r () ;
 3           try {
 4                 $ facebookSession = $ helper - > getSession () ;
 5           } catch ( Fa c e bo o k Re q u es t E xc e p ti o n $ ex ) {
 6                 // When Facebook returns an error
 7                 echo $ ex - > getMessage () ;
 8                 return false ;
 9           } catch (\ Exception $ ex ) {
10                 // When validation fails or other local issues
11                 echo $ ex - > getMessage () ;
12                 return false ;
13           }
14           if ( isset ( $ facebookSession ) ) {
15                 // user is logged in
16           }
17           // Facebook Session is not valid
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 ,
 4                                    ' GET ' ,
 5                                    '/ me '
 6                          );
 7                          try {
 8                                    $ response = $ requestU - > execute () ;
 9                          } catch ( F a c e b o o k A u t h o r i z a t i o n E x c e p t i o n $ 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:
36                                       CAPITOLO 5. IMPLEMENTAZIONE E TESTING

     • /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         * Responds to requests to GET / show / 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:
 1   /* *
 2    * Display the specified list .
 3    *
 4    * @param int $ id
 5    * @return Response
 6    */
 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   /* *
 2    * Ajax function example
 3    *
 4    * @param int $ id
 5    * @return Response
 6    */
 7   public function ajaxRequest ( $ id ) {
 8
 9           // do something
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.
38                                        CAPITOLO 5. IMPLEMENTAZIONE E TESTING

5.3      Implementazione dell’interfaccia
La realizzazione delle interfacce dell’applicazione è avvenuta utilizzando Blade, il tem-
plate engine di Laravel. Il linguaggio utilizzato per la codifica delle pagine è HTML
5, supportato graficamente da una Bootstrap 3 e con fogli di stile scritti nello standard
CSS3.

Blade
La creazione di template in Blade è molto semplice e sfrutta una serie di keywords
messe a disposizione dal template engine. Un esempio di template base è il seguente:
 1   
 2   < html >
 3         < head >
 4              < title > App Name - @yield ( ' title ') 
 5         
 6         < body >
 7              @section ( ' sidebar ')
 8                   Master sidebar .
 9              @endsection
10
11             < div class = " container " >
12                  @yield ( ' content ')
13             
14        
15   

                         Codice 5.7: esempio di template base in Blame

    In questo modo è possibile definire l’intelaiatura base della pagine, la quale è facil-
mente estendibile per creare poi vere e proprie pagine, che dovranno solamente definire
il loro contenuto specifico. La keyword @section definisce una sezione con dei conte-
nuti specifici che potrà essere estesa o ridefinita, mentre la keyword @yield funge da
segnaposto per contenuti che verranno aggiunti successivamente (da pagine derivanti
da questa “base”).
    Una possibile estensione del template base ad esempio può essere la seguente:
 1   @extends ( ' layouts . master ')
 2
 3   @section ( ' sidebar ')
 4             @parent
 5        appended to the master sidebar 
 6   @stop
 7
 8   @section ( ' content ')
 9        Page content . 
10   @stop

                        Codice 5.8: possibile estensione del template base

   Nell’esempio viene esteso il template prima indicato, al quale viene aggiunto del
contenuto alla sezione sidebar e definito il corpo della pagina finale.
5.3. IMPLEMENTAZIONE DELL’INTERFACCIA                                                   39

Javascript

Per lo sviluppo dell’applicativo è stato necessario un cospicuo utilizzo di script Java-
sript sviluppati appositamente, in particolare per rendere la paginazione client-side.
Inizialmente si sono cercate delle soluzioni prefabbricate, ma esse non rispondevano a
pieno alle esigenze richieste. Perciò si è deciso di sviluppare un plugin autonomamente
chiamato pagination.js.
   Per implementare questo plugin si è scelto di sfruttare la tecnica dei prototipi per
mantenere il codice più pulito.
   In Javascript ciascuna classe presenta al suo interno una proprietà, chiamata appun-
to prototype, che presenta un “meta oggetto”. Qualsiasi oggetto facente capo a questa
classe, sarà istanziato esattamente come una copia di questo prototipo. Modificando
questa meta classe, sarà possibile influenzare direttamente tutti i precedenti oggetti
creati a partire da questa classe, anche a runtime.
   Dunque è possibile definire una classe con il solo costruttore che imposta gli attributi
della classe, e successivamente aggiungere al prototipo i metodi della stessa, rendendo
più leggibile e mantenibile il codice.
   Si presenta ora un estratto dallo script pagination.js:
 1   function Pagination ( perPage , form_control , back_action , validation_func ) {
 2       this . itemPerPage = perPage ;
 3       this . form_control = form_control ;
 4       this . back_action = back_action ;
 5       this . validation_func = validation_func ;
 6   }
 7
 8   Pagination . prototype . _showPage = function ( i ) {
 9       this . items . hide () ;
10       this . items . removeClass ( ' hidden ') ;
11       var startIndex = 0 ;
12       var endIndex = 0 ;
13       if ( this . activePage == 1 ) {
14            startIndex = 0 ;
15            endIndex = this . itemPerPage ;
16       }
17       else {
18            startIndex = this . itemPerPage * ( this . activePage - 1 ) ;
19            endIndex = this . itemPerPage * ( this . activePage ) ;
20       }
21       var showItems = this . items . slice ( startIndex , endIndex ) ;
22       showItems . fadeIn () ;
23   };
24   [...]

                           Codice 5.9: estratto di pagination.js

   Nel codice sopra troviamo il costruttore della classe Pagination che riceve come
attributi: il numero di elementi per ogni pagina, un boleano che indica se attivare
la funzionalità di form, la funzione da eseguire con il pulsante back e la funzione di
validazione dei dati nel caso si tratti di un form. Questo script di paginazione infatti
permette di paginare semplici liste di elementi o anche dei form, entrambe funzionalità
ricercate per la realizzazione dell’applicazione.
40                                          CAPITOLO 5. IMPLEMENTAZIONE E TESTING

   Sotto il costruttore troviamo come, grazie al prototype, è possibile aggiungere il
metodo showPage (in questo caso metodo privato) alla classe Pagination.
   L’utilizzo del suddetto plugin è molto semplice, basta istanziare un nuovo oggetto
Pagination passando al costruttore le configurazioni desiderate e utilizzare i metodi
createNav() e activatePage(); rispettivamente per creare il menù di paginazione e
attivare la prima pagina. Unici vincoli sono la presenza, nella pagina da paginare, di
un div con attributo id=item-container contenente gli elementi da paginare e un ul
con id=pagination che conterrà il menù creato dal plugin.
1    function goBack () {
2        $ ( '# list - info ') . toggleClass ( ' hidden ' , ' true ') ;
3        $ ( '# item - list ') . toggleClass ( ' hidden ' , ' false ') ;
4    }
5
6    var pag = new Pagination ( du_item_per_page , 1 , goBack ) ;
7    pag . createNav () ;
8    pag . activatePage ( 1 ) ;

                      Codice 5.10: utilizzo di pagination in drawing_up.js

5.3.1     Autenticazione
Non appena un nuovo utente tenti di utilizzare l’applicazione verrà mostrato il pop-
up in figura 5.2, con il quale si acconsente l’invio delle proprie informazioni ad essa.
In particolare verrà richiesto l’accesso al profilo pubblico, all’indirizzo email e alla
lista degli amici. L’utente può eventualmente negare l’accesso a queste due ultime,
compromettendo però la fruizione alla funzionalità di vedere i risultati degli amici che
hanno compilato le sue stesse liste.
Puoi anche leggere