Top Banner
Flow: viaggio nel futuro con un caso realizzato Tarcisio Fedrizzi 16-17 Novembre 2012 Bologna
37

Flow: viaggio nel futuro con un caso realizzato

Dec 05, 2014

Download

Technology

La presentazione sull'utilizzo di TYPO3.Flow in progetto reale tenuta al T3Camp Italia 2012
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Flow: viaggio nel futuro con un caso realizzato

Flow: viaggio nel futuro con un caso realizzato

Tarcisio Fedrizzi16-17 Novembre 2012

Bologna

Page 2: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 2/37

Federazione provinciale Scuole materne di Trento

✗ Associazione di 135 scuole materne✗ 21 circoli✗ Quasi 1500 maestre

Page 3: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 3/37

Outline

✗ Presentazione✗ Il progetto

✗ Dominio✗ Tecnologie

✗ POSIT.MethodLogger✗ Annotazioni✗ AOP

✗ Fluid Standalone

✗ Considerazioni su Flow

✗ Conclusioni✗ Domande

Page 4: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 4/37

Presentazione

✗ Libero professionista dal 2005

✗ Socio di POSIT dal 2009

✗ Progettazione e sviluppo applicazioni ad-hoc

✗ Primo progetto basato su TYPO3.Flow messo in produzione

Page 5: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 5/37

210ore: tecnologie 1/2

✗ Server: TYPO3.Flow✗ Client:

✗ Insegnanti: ExtJS 4(è statonecessario renderel'interfacciapiù fedele possibilea quella del clientwindows usatoin precedenza)

Page 6: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 6/37

210ore: tecnologie 2/2

✗ Gestori:TYPO3.Fluid +JQuery DataTable

✗ Amministratori:TYPO3.ExposeoppureTYPO3.Fluid(ancora infase di sviluppo)

Page 7: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 7/37

Il modulo POSIT.MethodLogger

✗ Estratto dal progetto 210ore✗ Permette di loggare chiamate a qualsiasi

metodo✗ È possibile accedere ai parametri della

chiamata✗ Permette di vedere alcuni aspetti del

framework Flow in azione

Page 8: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 8/37

Annotazioni 1/2

Elementi che permettono di “appiccicare” dei dati descrittivi (metadati) a classi, metodi e interfacce

✗ In alcuni linguaggi (es. Java) sono un costrutto che fa parte del linguaggio

✗ In altri, tra cui PHP, non sono ancora disponibili nativamente e vengono quindi specificate nei commenti.

Page 9: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 9/37

Annotazioni 2/2

✗ Flow ne fa un uso piuttosto consistente. Ad esempio:

nelle definizioni delle Entità.

... use TYPO3\Flow\Annotations as Flow; ... /** * @Flow\Entity */ class MethodLog { ...

Page 10: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 10/37

Definizione Annotazioni

✗ Semplice classe che contiene i parametri passati dove l'annotazione è specificata;

✗ I parametri sono passati al costruttore dell'annotazione in un unico array.

... * @Annotation * @Target("METHOD") */ final class LogMethod { /** * @var string */ public $message; ...

... class PostController { /** * @POSIT\LogMethod( * message="Creato post.") */ public function createAction( ...

Page 11: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 11/37

AOP 1/2

Ideata da Gregor Kiczales e altri di Xerox PARC

✗ Permette di mantenere una netta separazione tra logica di business e funzionalità non specifiche dell'applicazione

✗ Queste funzionalità vengono aggiunte con un sistema che si basa su tre concetti

Page 12: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 12/37

AOP 2/2

✗ I concetti sono i seguenti:✗ Advice: definisce la funzionalità che dev'essere

aggiunta (Logging, controlli di accesso, ecc);✗ Pointcut: permette di specificare in quali punti la

funzionalità dev'essere eseguita (prima di chiamare un metodo, quando viene lanciata un'eccezione, ecc);

✗ Join point: descrive il contesto presente nel punto in cui è stata sospesa l'esecuzione.

Page 13: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 13/37

AOP in Flow: Aspect

✗ L'aspetto in Flow è una classe annotata con @Flow\Aspect.

✗ La classe deve inoltre definire un Advice o un Pointcut per essere un aspetto considerato valido.

... /** * @Flow\Aspect */ class LogMethodAspect { /** * @Flow\Around( * "POSIT\MethodLogger\Aspect\LogMethodAspect->methodsAnnotatedWithLogMethod") */ public function runMethodLogging(\TYPO3\Flow\Aop\JoinPointInterface $joinPoint){ ...

Page 14: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 14/37

AOP in Flow: Pointcut

✗ Flow offre diversi designatori di pointcut: method, class, ecc...

✗ Essi permettono di selezionare i metodi ai quali dev'essere applicato un advice

... /** * @Flow\Pointcut( * "methodAnnotatedWith( * POSIT\MethodLogger\Annotations\LogMethod)") */ public function methodsAnnotatedWithLogMethod() {} ...

Page 15: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 15/37

AOP in Flow: Advice

✗ L'advice è il metodo che viene eseguito quando vengono chiamati i metodi selezionati con il pointcut;

✗ Esso viene eseguito secondo le indicazioni dall'annotazione che decora il metodo;

... /** * @Flow\Around( * "POSIT\MethodLogger\Aspect\LogMethodAspect->methodsAnnotatedWithLogMethod") */ public function runMethodLogging(\TYPO3\Flow\Aop\JoinPointInterface $joinPoint){ $logMethod = $this->getLogMethodAnnotation($joinPoint); $this->logMessage($joinPoint, $logMethod); return $joinPoint->getAdviceChain()->proceed($joinPoint); } ...

Page 16: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 16/37

AOP in Flow: Join point

✗ Il join point permette di accedere al contesto e alla descrizione del metodo al quale è applicato l'advice;

✗ tramite il join point è possibile conoscere il nome del metodo, i parametri che sono stati passati, ecc

... $i = 0; $className = $joinPoint->getClassName(); $methodName = $joinPoint->getMethodName(); $methodArguments = $joinPoint->getMethodArguments(); print("$className->$methodName("); foreach ($methodArguments as $argumentName => $argumentValue) { if ($i++ > 0) { print(", "); } print("$argumentName = $argumentValue"); } print(");\n"); ...

Page 17: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 17/37

Fluid standalone 1/2

✗ È possibile utilizzare il motore di templating anche in maniera standalone

✗ Questo ci permette di riutilizzare la sintassi di fluid anche in contesti differenti rispetto a quello delle pagine web

private function renderViewText(\TYPO3\Flow\Aop\JoinPointInterface $joinPoint $text) { $textView = new \TYPO3\Fluid\View\StandaloneView(); $textView->initializeObject(); $textView->setTemplateSource($text); foreach ($joinPoint->getMethodArguments() as $name => $value) { $textView->assign($name, $value); } return $textView->render(); }

Page 18: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 18/37

Fluid standalone 2/2

✗ L'utilizzo del metodo definito nella slide precedente ci permette quindi di accedere ai parametri del metodo loggato all'interno del messaggio di log

... /** * @POSIT\LogMethod(message="{newPost.author} ha creato il nuovo * post intitolato {newPost.title}.") */ public function createAction( \TYPO3\Blog\Domain\Model\Post $newPost) { ...

Page 19: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 19/37

Considerazioni su Flow 1/9

✗ Dal punto di vista tecnologico offre molte possibilità (AOP, annotazioni, slot e segnali)✗ c'è tutto quello che (e anche di più) può servire per lo

sviluppo web

✗ È in generale semplice aggiungere e/o modificare le funzionalità offerte dal framework✗ Si tratta in genere di ereditare da una classe e di

implementare un'interfaccia definendo pochi metodi (molte volte è sufficiente uno)

Page 20: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 20/37

Considerazioni su Flow 2/9

✗ Il sistema di controllo degli accessi è molto flessibile✗ Permette di specificare anche condizioni

complesse modificando soltanto i file di configurazione

✗ Il sistema di mapping dei parametri della richiesta sui parametri del metodo dell'azione chiamata nel controller permette di mantenere la logica di business molto pulita

Page 21: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 21/37

Considerazioni su Flow 3/9

✗ Configurabilità da file✗ Semplice aggiungere la configurazione anche

per i propri moduli✗ L'interfaccia a linea di comando✗ Semplice aggiungere comandi per i propri

moduli

Page 22: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 22/37

Considerazioni su Flow 4/9

✗ Problema maggiore riguarda l'usabilità:✗ Punti fondamentali per lo sviluppo

di un progetto reale non sonodocumentati. Ad esempio:

✗ Logging e debugging✗ Deployment e amministrazione

✗ L'applicazione di esempio TYPO3.Blog copre alcune casistiche ma non offre un esempio esaustivo

✗ Gli esempi che ci sono nella documentazione sono utili ma anche in questo caso non esaustivi

Page 23: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 23/37

Considerazioni su Flow 5/9

✗ In molti casi è difficile capire dov'è o a quale elemento si riferisce un errore

✗ Non c'è menzione a qualche cosa che mi possa aiutare a trovare il soggetto dell'errore

Page 24: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 24/37

Considerazioni su Flow 6/9

✗ E lo stacktrace dell'eccezione scritto su file non offre maggiori informazioni

Uncaught exception #1222268609 in line 146 of Data/Temporary/Development/Cache/Code/FLOW3_Object_Classes/TYPO3_FLOW3_Security_Authorization_AccessDecisionVoterManager. Php: Access denied (1 denied, 0 granted, 0 abstained)

22 TYPO3\FLOW3\Security\Authorization\AccessDecisionVoterManager_Original::decideOnJoinPoint(TYPO3\FLOW3\Aop\JoinPoint) 21 TYPO3\FLOW3\Security\Authorization\AccessDecisionVoterManager::decideOnJoinPoint(TYPO3\FLOW3\Aop\JoinPoint) 20 call_user_func_array(array, array) 19 TYPO3\FLOW3\Security\Authorization\AccessDecisionVoterManager::FLOW3_Aop_Proxy_invokeJoinPoint(TYPO3\FLOW3\Aop\JoinPoint) 18 TYPO3\FLOW3\Security\Authorization\AccessDecisionVoterManager::decideOnJoinPoint(TYPO3\FLOW3\Aop\JoinPoint) 17 TYPO3\FLOW3\Security\Authorization\Interceptor\PolicyEnforcement_Original::invoke() 16 TYPO3\FLOW3\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(TYPO3\FLOW3\Aop\JoinPoint) 15 TYPO3\FLOW3\Aop\Advice\AroundAdvice::invoke(TYPO3\FLOW3\Aop\JoinPoint) 14 TYPO3\FLOW3\Aop\Advice\AdviceChain::proceed(TYPO3\FLOW3\Aop\JoinPoint) 13 POSIT\DuecentodieciOre\Controller\Domain\Accounting\AnnualEstimateController::initializeAction() 12 TYPO3\FLOW3\Mvc\Controller\ActionController_Original::processRequest(TYPO3\FLOW3\Mvc\ActionRequest, TYPO3\FLOW3\Http\Response) 11 TYPO3\FLOW3\Mvc\Dispatcher_Original::dispatch(TYPO3\FLOW3\Mvc\ActionRequest, TYPO3\FLOW3\Http\Response) 10 TYPO3\FLOW3\Mvc\Dispatcher::dispatch(TYPO3\FLOW3\Mvc\ActionRequest, TYPO3\FLOW3\Http\Response) 9 call_user_func_array(array, array) 8 TYPO3\FLOW3\Mvc\Dispatcher::FLOW3_Aop_Proxy_invokeJoinPoint(TYPO3\FLOW3\Aop\JoinPoint) 7 TYPO3\FLOW3\Aop\Advice\AdviceChain::proceed(TYPO3\FLOW3\Aop\JoinPoint) 6 TYPO3\FLOW3\Security\Aspect\RequestDispatchingAspect_Original::blockIllegalRequestsAndForwardToAuthenticationEntryPoints( TYPO3\FLOW3\Aop\JoinPoin t) 5 TYPO3\FLOW3\Aop\Advice\AroundAdvice::invoke(TYPO3\FLOW3\Aop\JoinPoint) 4 TYPO3\FLOW3\Aop\Advice\AdviceChain::proceed(TYPO3\FLOW3\Aop\JoinPoint) 3 TYPO3\FLOW3\Mvc\Dispatcher::dispatch(TYPO3\FLOW3\Mvc\ActionRequest, TYPO3\FLOW3\Http\Response) 2 TYPO3\FLOW3\Http\RequestHandler::handleRequest() 1 TYPO3\FLOW3\Core\Bootstrap::run()

Page 25: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 25/37

Considerazioni su Flow 7/9

✗ Spesso errori nel progetto (per esempio derivanti da elaborazione del codice del progetto da parte del framework, configurazioni errate all'interno del progetto) producono stacktrace e messaggi in cui non appare niente che riguarda il progetto. Questo rende quindi molto difficile e pesante comprendere qual'è il problema.

Page 26: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 26/37

Considerazioni su Flow 8/9

✗ Assenza di utility per rendere lo sviluppo più comodo e rapido✗ Mi sarei aspettato di trovare nella distribuzione

base:✗ Un'interfaccia web per il debugging (area che posso

consultare per leggere i log, profiling, ecc)✗ Vedi Debug.Toolbar (debug), Plumber (profiling)

✗ Un'interfaccia grafica per una gestione di base degli oggetti definiti nel progetto

✗ Vedi TYPO3.Expose

Page 27: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 27/37

Considerazioni su Flow 9/9

✗ Un interfaccia CRUD che mi permetta di gestire gli oggetti nel database senza dover scrivere sempre lo stesso codice.

✗ L'usabilità è troppe volte posta come un elemento a bassa priorità. È invece molto importante dato che la sua carenza:✗ costituisce una barriera per l'adozione da parte di

nuovi utenti✗ rende frustranti operazioni che dovrebbero

essere semplici

Page 28: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 28/37

Conclusione✗ TYPO3.Flow è un framework completo che offre tutti gli strumenti per creare le più

disparate applicazioni web✗ Offre una base ricca e solida su cui costruire i propri progetti✗ Ancora molto dev'essere fatto sul fronte dell'usabilità perché:

✗ non tutti se la sentono di mettere il naso nel codice del framework per fare il debug della propria applicazione

✗ un framework che si pone come obiettivo di ...“far tornare la gioia di sviluppare.”... dovrebbe rendere veloci e semplici quelle operazioni noiose e ripetitive che fanno parte di ogni progetto

✗ Per evitare che il progetto rimanga nel limbo è necessario cominciare ad utilizzare, e quindi testare, il framework in ambienti reali. Soltanto così è possibile verificare quali aspetti vanno migliorati, capire cosa sarebbe comodo avere e, riportandolo agli sviluppatori oppure contribuendo noi stessi, migliorare il framework fino a renderlo lo strumento più adatto alle nostre esigenze.

Page 29: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 29/37

Grazie per l'attenzione

✗ Il codice dell'esempio mostrato nella presentazione è disponibile all'url:✗ https://github.com/posit-it/POSIT.MethodLogger

✗ L'esempio gira su Flow 2.0 (ex FLOW3 1.2)

✗ Altri pacchetti menzionati nella presentazione:✗ Plumber:

✗ https://github.com/sandstorm/Plumber✗ Debug.Toolbar:

✗ https://github.com/mneuhaus/Debug.Toolbar/✗ TYPO3.Expose:

✗ http://git.typo3.org/FLOW3/Packages/TYPO3.Expose.git

Page 30: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 30/37

Persistenza

✗ In Flow la persistenza dei dati è gestita tramite un livello di astrazione

✗ Flow si basa sulla programmazione orientata agli oggetti. Questo implica che in flow la “base dati” è costituita dalla definizione di una serie di oggetti collegati tra loro.

✗ Dietro le quinte il framework si occupa di mappare gli oggetti da e verso il database

Page 31: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 31/37

Persistenza: Doctrine

✗ Flow supporta diversi metodi di persistenza tuttavia quello maggiormente integrato è Doctrine.

✗ Doctrine (la versione 2 è quella integrata in FLOW) è un Object Relational Mapping Software. Questo genera, a partire dalla descrizione dei dati e dalle azioni che noi facciamo sui dati stessi, le query che aggiornano i dati nel database.

Page 32: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 32/37

Persistenza: entità

✗ Per poter mappare gli oggetti su database è necessario decorare gli oggetti con alcune annotazioni. Queste permettono all'ORM di raccogliere le informazioni necessarie a generare lo schema.

... * @Flow\Entity */ class MethodLog { ... /** * L'indirizzo del client che ha causato l'invocazione del metodo loggato. * @var string * @ORM\Column(length=15, nullable=true) */ protected $ip; ...

Page 33: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 33/37

Gestione degli oggetti

✗ In Flow il cliclo di vita degli oggetti è gestito automaticamente dal framework

✗ La gestione degli oggetti viene quindi affidata ad una classe chiamata ObjectManager

✗ Ad ogni classe è associato quello che è definito scope. Questo determina il modo in cui viene gestito il ciclo di vita dell'oggetto

Page 34: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 34/37

Gestione degli oggetti

✗ Gli scope offerti dal framework sono:✗ Singleton: il gestore degli oggetti crea un'unica istanza

dell'oggetto. Ogni volta che viene richiesto l'oggetto viene ritornata la stessa istanza.

✗ Session: il ciclo di vita dell'oggetto corrisponde alla sessione di un utente. L'oggetto che ha questo tipo di scope è quindi specifico per ogni sessione.

✗ Prototype: ogni volta che si richiede un oggetto con questo tipo di scope ne viene ritornata una nuova istanza

Page 35: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 35/37

Dependency injection

✗ La gestione centralizzata degli oggetti permette di eliminare la gestione delle dipendenze tra gli oggetti.

✗ È possibile richiedere un oggetto in varie maniere. La più semplice consiste nella specifica di due annotazioni nel commento della variabile che ospiterà l'oggetto.

... /** * Il repository delle operazioni fatte dagli utenti. * * @Flow\Inject * @var \POSIT\MethodLogger\Domain\Repository\MethodLogRepository */ protected $methodLogRepository; ...

Page 36: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 36/37

Configurazione 1/2

✗ Flow mette a disposizione tramite la dependency injection un meccanismo semplice per l'accesso a impostazioni di configurazioni specifiche del modulo.

... /** * L'array che contiene le * impostazioni specificate per * il package. * @var array */ protected $settings; ... /** * @param array $settings * @return void */ public function injectSettings(array $settings) { $this->settings = $settings; } ...

Page 37: Flow: viaggio nel futuro con un caso realizzato

17 Novembre 2012 Tarcisio Fedrizzi - T3Camp Bologna 37/37

Configurazione 2/2

✗ Una volta iniettato l'array delle impostazioni sarà possibile accedere all'albero di configurazione che è denominato come il namespace del modulo

... private function isEnabled() { return array_key_exists('enable', $this->settings) && $this->settings['enable']; } ...

... POSIT MethodLogger enable: true ...