$pugMarche->round1()Intro a Symfony2
Cose ?Symfony2 è un insieme di componenti PHPdisaccopiati e coesi utili per la risoluzione diproblemi comuni.Symfony2 è an...
Cose ?Symfony2 è un insieme di componenti PHPdisaccopiati e coesi utili per la risoluzione diproblemi comuni.Symfony2 è an...
Symfony2 è un insieme di componenti PHPdisaccopiati e coesi utili per la risoluzione diproblemi comuni.Symfony2 è anche un...
Symfony2 non è un framework ma un progettoPossiamo scegliere se utilizzare alcunecomponenti o tutto il full-stack framewor...
Non è un MVC frameworkIl core non fornisce la parte del model.Possiamo decidere se implementarla con unORM (Doctrine), o i...
Possiamo definire Symfony2 come un HTTPRequest/Response frameworkRiceve richieste HTTP da un client, le elaboraed invia la...
E stato pensato e costruito intorno allespecifice HTTPLa logica di applicazioni moderne è sempre piùspostata nel browserCi...
HTTP RequestGET /contact HTTP/1.1Host: xkcd.comAccept: text/htmlUser-Agent: Mozilla/5.0(Macintosh)VERBOHeaderHTTP
HTTP Request / VERBIHEAD RECUPERA GLI HEADER DELLARISORSA( no body )GET RECUPERA LA RISORSA DAL SERVERPOST CREA LA RISORSA...
HTTP ResponseHTTP/1.1 200 OKDate: Sat, 02 Apr 2011 21:05:05 GMTServer: lighttpd/1.4.19Content-Type: text/html
Symfony2 e HTTPSymfonyComponentHttpFoundationRequestSymfonyComponentHttpFoundationResponse
● Youporn● Utilizzato per tanti progetti importanti (BBC,CBS ..)● Sta diventando la base di molti progettiOpen Source (sil...
● Molti eventi e gruppi● Documentazione molto esaustiva e incontinuo aggiornamento● Abbraccia la filosofia "dont reinvent ...
● Codice robusto (ben scritto, testato)● Tag @api (api pubblica stabile)● introduce lutilizzo di tool fantastici comeCompo...
Componentidependency injectionFormTranslationHttp KernelClass LoaderDom CrawlerHttp FoundationTemplatingEvent DispatcherCo...
PHP 5.3
namespace SymfonyComponentHttpFoundation;namespace SymfonyComponentHttpKernel;namespace PugMarcheRound1Esempiuse SymfonyCo...
Sono stati creati principalmente per risolveredue problematiche legate alla creazione diclassi e codice riutilizzabile:1. ...
Grazie ai namespace e alla possibilità didefinire funzioni di autoloading, il codicediventa indipendente da dove sono defi...
In symfony2 viene caricato app/autoload.php che ha ilcompito di includere tutti i file src/ e vendor/Non si avrà mai bisog...
Funzione anonima (o lambda) che puòessere definita in qualsiasi momentoNon possiede un nomePermette di creare una funzione...
$string = "Hello";$closure = function($name) use ($string) {echo "$string $name";};$closure("Riccardo");Prima :$hello = cr...
Quando viene eseguita, nel suo stack diesecuzione si porta dietro lambiente che haintorno al punto dove viene definita (ov...
$input = array(1, 2, 3, 4);$output = array_filter($input, function($v) {return $v >2;});Risultato : array(3, 4)Utilizzata ...
ClosureVantaggi :● migliore leggibilità rispetto acreate_function● migliora le prestazioni: compilate durantela fase di pa...
Symfony dalla versione 2.1 adotta Composerper la gestione delle dipendenze (vendors) edeventualmente anche per linstallazi...
Download composer e symfony da dentro la cartella del progetto:curl -s https://getcomposer.org/installer | phpphp composer...
Partiamo dalla creazione di un bundle checonterrà tutto il sorgente della nostraapplicazionephp app/console generate:bundl...
Viene creata la cartella:src/PugMarche/Round1/HelloBundleIn app/AppKernel.php viene aggiunto :public function registerBund...
Creazione di un controllore:// src/PugMarche/Round1/HelloBundle/Controller/HelloController.phpnamespace PugMarcheRound1Hel...
Creazione di un rotte:// src/PugMarche/Round1/HelloBundle/Controller/HelloController.phpnamespace PugMarcheRound1HelloBund...
Creazione di una rotta:// app/config/routing.ymlpug_marche_round1_hello:resource: "@PugMarcheRound1HelloBundle/Controller/...
Template engineVELOCEogni template è compilato in una classe PHP con codiceottimizzato. Loverhead di compilazione è minimo...
Template engineSICUROPossibilità di impostare un escape automatico su ogni output;lo sviluppatore può definire una sandbox...
Esempio di utilizzo del tag "for":<ul>{% for user in users %}<li>{{ user.username }}</li>{% else %}<li>Nessun utente trova...
Creazione di un vista (twig):// src/PugMarche/Round1/HelloBundle/Controller/HelloController.phpnamespace PugMarcheRound1He...
Con un template riusciamo a spostare tutta la presentazione (HTML) in un fileseparato e di poterlo riutilizzare (o riutili...
Il nostro template Twig:{# src/PugMarche/Round1/HelloBundle/Resources/views/Hello/index.html.twig #}{% extends ::base.html...
Il padre:{# app/Resources/views/base.html.twig #}<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/...
app : configurazione dell applicazionesrc : tutto il codice php della nostra applicazionevendor : librerie dei venditoriwe...
Link:http://fabien.potencier.org/article/65/why-symfonyhttp://fabien.potencier.org/article/49/what-is-symfony2http://jason...
Upcoming SlideShare
Loading in …5
×

introduzione a symfony 2

663 views
601 views

Published on

Primo incontro del PUG March

http://marche.grusp.org/

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
663
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

introduzione a symfony 2

  1. 1. $pugMarche->round1()Intro a Symfony2
  2. 2. Cose ?Symfony2 è un insieme di componenti PHPdisaccopiati e coesi utili per la risoluzione diproblemi comuni.Symfony2 è anche un framework completo
  3. 3. Cose ?Symfony2 è un insieme di componenti PHPdisaccopiati e coesi utili per la risoluzione diproblemi comuni.Symfony2 è anche un framework completo# indipendenti da altri componenti(modificando A non rompo B)
  4. 4. Symfony2 è un insieme di componenti PHPdisaccopiati e coesi utili per la risoluzione diproblemi comuni.Symfony2 è anche un framework completo# singola responsabilità (quindi un unicomotivo per essere modificati)Cose ?
  5. 5. Symfony2 non è un framework ma un progettoPossiamo scegliere se utilizzare alcunecomponenti o tutto il full-stack frameworkCose ?
  6. 6. Non è un MVC frameworkIl core non fornisce la parte del model.Possiamo decidere se implementarla con unORM (Doctrine), o in qualsiasi altro modoGarantisce la separazione della logica dallapresentazioneCose ?
  7. 7. Possiamo definire Symfony2 come un HTTPRequest/Response frameworkRiceve richieste HTTP da un client, le elaboraed invia la risposta al serverPuò implementare un pattern MVC perlorganizzazione interna dellapplicazione.Cose ?
  8. 8. E stato pensato e costruito intorno allespecifice HTTPLa logica di applicazioni moderne è sempre piùspostata nel browserCi serve quindi qualcosa in grado di gestirerichieste e inviare risposteCose ?
  9. 9. HTTP RequestGET /contact HTTP/1.1Host: xkcd.comAccept: text/htmlUser-Agent: Mozilla/5.0(Macintosh)VERBOHeaderHTTP
  10. 10. HTTP Request / VERBIHEAD RECUPERA GLI HEADER DELLARISORSA( no body )GET RECUPERA LA RISORSA DAL SERVERPOST CREA LA RISORSA SUL SERVERPUT MODIFICA LA RISORSA SUL SERVERDELETE CANCELLA LA RISORSA DAL SERVER
  11. 11. HTTP ResponseHTTP/1.1 200 OKDate: Sat, 02 Apr 2011 21:05:05 GMTServer: lighttpd/1.4.19Content-Type: text/html
  12. 12. Symfony2 e HTTPSymfonyComponentHttpFoundationRequestSymfonyComponentHttpFoundationResponse
  13. 13. ● Youporn● Utilizzato per tanti progetti importanti (BBC,CBS ..)● Sta diventando la base di molti progettiOpen Source (silex, phpunit, behat, assetic,doctrine, propel, phpBB, Drupal8, ezPublish)● Tutto questo utilizzo inevitabilmente miglioralinteroperabilità tra questi progetti (ci siavvicina ad uno standard)● Vasta comunità ( > 1600 bundles sviluppatisolo nellultimo anno)Perchè ?
  14. 14. ● Molti eventi e gruppi● Documentazione molto esaustiva e incontinuo aggiornamento● Abbraccia la filosofia "dont reinvent thewheel" fornendo una stretta integrazionecon molti progetti open source● Abbraccia a pieno PHP 5.3● Dependency Injection● Twig Template engine (che verrà utilizzatoda Drupal ed ezPublish)● Built-in web profiler e consolePerchè ?
  15. 15. ● Codice robusto (ben scritto, testato)● Tag @api (api pubblica stabile)● introduce lutilizzo di tool fantastici comeComposerPerchè ?
  16. 16. Componentidependency injectionFormTranslationHttp KernelClass LoaderDom CrawlerHttp FoundationTemplatingEvent DispatcherConsoleRouting SecurityValidatortutti mantenuti su repo git
  17. 17. PHP 5.3
  18. 18. namespace SymfonyComponentHttpFoundation;namespace SymfonyComponentHttpKernel;namespace PugMarcheRound1Esempiuse SymfonyComponentDependencyInjectionContainerInterface;use SymfonyComponentDependencyInjectionContainerBuilder;Rappresentano un modo di creare insiemi di classi, interfacce,funzioni e costanti legate tra loro dal comune obiettivo di risolvere unproblemaNamespace
  19. 19. Sono stati creati principalmente per risolveredue problematiche legate alla creazione diclassi e codice riutilizzabile:1. collisione dei nomi tra le classi (due classicon lo stesso nome nello stesso progetto)2. possibilità di creare alias(PugMarcheRound1EsempiPrimoEsempio as Es1), per accorciare i nomi delleclassi e migliolare la leggibilità del codiceNamespace
  20. 20. Grazie ai namespace e alla possibilità didefinire funzioni di autoloading, il codicediventa indipendente da dove sono definiti isuoi elementi allinterno del filesystemPRS-0 definisce lo standard di utilizzo per inamespaceAutoloading (PSR-0)
  21. 21. In symfony2 viene caricato app/autoload.php che ha ilcompito di includere tutti i file src/ e vendor/Non si avrà mai bisogno di includere file "a mano".Symfony2 utilizza i namespace e la convezione psr-0 perauto-includere tutti i file che servirannoNome della classe:PugMarcheRound1HelloBundleControllerHelloControllerPercorso:src/PugMarche/Round1/HelloBundle/Controller/HelloController.phpAutoloading (PSR-0)
  22. 22. Funzione anonima (o lambda) che puòessere definita in qualsiasi momentoNon possiede un nomePermette di creare una funzione "al volo" epassarla come parametro in altri costrutti dellinguaggioClosure
  23. 23. $string = "Hello";$closure = function($name) use ($string) {echo "$string $name";};$closure("Riccardo");Prima :$hello = create_function($name, $string, echo "$string $name" );Rispetto ad una funziona anonima, la closurepuò accedere a variabili definite al di fuoridella closure stessaClosure
  24. 24. Quando viene eseguita, nel suo stack diesecuzione si porta dietro lambiente che haintorno al punto dove viene definita (ovvero puòreferenziare variabili/oggetti che ha intorno emodificarli - quindi è in grado di modifcare lostato di tali oggetti)Closure
  25. 25. $input = array(1, 2, 3, 4);$output = array_filter($input, function($v) {return $v >2;});Risultato : array(3, 4)Utilizzata principalmente allinterno dichiamate di callbackClosure
  26. 26. ClosureVantaggi :● migliore leggibilità rispetto acreate_function● migliora le prestazioni: compilate durantela fase di parsing del codice sorgente(create_function eseguita a run-time nonpuò essere messa in cache)
  27. 27. Symfony dalla versione 2.1 adotta Composerper la gestione delle dipendenze (vendors) edeventualmente anche per linstallazione. Dallaversione 2.1 viene utilizzato anchelautoloader di composer.http://symfony.com/downloadhttp://symfony.com/doc/current/book/installation.htmlhttp://getcomposer.org/Installazione e config.
  28. 28. Download composer e symfony da dentro la cartella del progetto:curl -s https://getcomposer.org/installer | phpphp composer.phar create-project symfony/framework-standard-edition path/2.1.2Aggiornare i vendors:php composer.phar installCheck configurazione:http://symfony.com/doc/current/book/installation.html#configuration-and-setupEscludere i vendors dal repository:.gitignore >> /vendor/Installazione e config.
  29. 29. Partiamo dalla creazione di un bundle checonterrà tutto il sorgente della nostraapplicazionephp app/console generate:bundle --namespace=PugMarche/Round1/HelloBundleCreazione di una pagina - #1
  30. 30. Viene creata la cartella:src/PugMarche/Round1/HelloBundleIn app/AppKernel.php viene aggiunto :public function registerBundles(){$bundles = array(// ...new PugMarcheRound1HelloBundlePugMarcheHelloBundle(),);// ...return $bundles;}Creazione di una pagina - #1
  31. 31. Creazione di un controllore:// src/PugMarche/Round1/HelloBundle/Controller/HelloController.phpnamespace PugMarcheRound1HelloBundleController;use SymfonyComponentHttpFoundationResponse;class HelloController{public function indexAction($name){return new Response(<html><body>Ciao .$name.!</body></html>);}}Ha il compito di elaborare la richiesta che arriva e restituire una risposta. Ilcontrollore deve sempre tornare un oggetto Response.Creazione di una pagina - #2
  32. 32. Creazione di un rotte:// src/PugMarche/Round1/HelloBundle/Controller/HelloController.phpnamespace PugMarcheRound1HelloBundleController;use SymfonyComponentHttpFoundationResponse;use SensioBundleFrameworkExtraBundleConfigurationRoute;class HelloController{/*** @Route("/hello/{name}", name="hello_action")*/public function indexAction($name){return new Response(<html><body>Ciao .$name.!</body></html>);}}Creazione di una pagina - #2possiamo accederealloggetto Request
  33. 33. Creazione di una rotta:// app/config/routing.ymlpug_marche_round1_hello:resource: "@PugMarcheRound1HelloBundle/Controller/"type: annotationprefix: /Definire una rotta significa semplicementedefinire un mapping tra un URL della nostraapplicazione con una action nel controllore(ovvero con un metodo)Creazione di una pagina - #2
  34. 34. Template engineVELOCEogni template è compilato in una classe PHP con codiceottimizzato. Loverhead di compilazione è minimo. La classeviene eseguita a runtime (app/cache/{env}/twig)FACILEPensato per essere facile da leggere anche da parte deigrafici (semplice da imparare)TWIG
  35. 35. Template engineSICUROPossibilità di impostare un escape automatico su ogni output;lo sviluppatore può definire una sandbox per i template dovelutente ha un accesso limitato ai tags, filtri, oggetti e funzioniFLESSIBILEPossibilità di creare tags, filtri, funzioni, operatori. Ereditarietàtra i templateTWIG
  36. 36. Esempio di utilizzo del tag "for":<ul>{% for user in users %}<li>{{ user.username }}</li>{% else %}<li>Nessun utente trovato</li>{% endfor %}</ul>.. altri tags: if, filter, extends .. http://twig.sensiolabs.org/doc/tags/index.htmlEsempio di utilizzo filtro "upper":{{ title | upper }} -> possibilità di creare dei fitri custom..altri filtri: date, url_encode, json_encode, capitalize .. http://twig.sensiolabs.org/doc/filters/index.htmlTWIG
  37. 37. Creazione di un vista (twig):// src/PugMarche/Round1/HelloBundle/Controller/HelloController.phpnamespace PugMarcheRound1HelloBundleController;use SymfonyComponentHttpFoundationResponse;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;class HelloController extends Controller{/*** @Route("/hello/{name}")*/public function indexAction($name){return $this->render(AcmeHelloBundle:Hello:index.html.twig, array(name => $name));}}Creazione di una pagina - #2
  38. 38. Con un template riusciamo a spostare tutta la presentazione (HTML) in un fileseparato e di poterlo riutilizzare (o riutilizzare porzioni) per diverse paginerender() restituisce un oggetto Response popolato con il contenuto del templatedato.Per utilizzare render() il controllore deve estendere la classe Controller, cheaggiunge degli helper (come render) alla nostra classeNomeBundle:NomeControllore:NomeTemplate/percorso/di/NomeBundle/Resources/views/NomeControllore/NomeTemplateCreazione di una pagina - #2
  39. 39. Il nostro template Twig:{# src/PugMarche/Round1/HelloBundle/Resources/views/Hello/index.html.twig #}{% extends ::base.html.twig %}{% block body %}Ciao {{ name }}!{% endblock %}{% %} -> esegue qualcosa{{ }} -> stampa qualcosaCreazione di una pagina - #2
  40. 40. Il padre:{# app/Resources/views/base.html.twig #}<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>{% block title %}Benvenuto!{% endblock %}</title>{% block stylesheets %}{% endblock %}<link rel="shortcut icon" href="{{ asset(favicon.ico) }}" /></head><body>{% block body %}{% endblock %}{% block javascripts %}{% endblock %}</body></html>Creazione di una pagina - #2
  41. 41. app : configurazione dell applicazionesrc : tutto il codice php della nostra applicazionevendor : librerie dei venditoriweb : cartella accessibile pubblicamente (contiene ifrontcontroller che eseguono il bootstrap e inviano larichiesta al kernel; assets)Struttura cartelle
  42. 42. Link:http://fabien.potencier.org/article/65/why-symfonyhttp://fabien.potencier.org/article/49/what-is-symfony2http://jasoncoffin.com/2011/03/10/cohesion-and-coupling-principles-of-orthogonal-object-orientated-programming/https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.mdhttp://www.phpbestpractices.it/http://www.phptherightway.comhttp://getcomposer.orghttp://symfony.com/doc/current/book/index.htmlRiferimenti

×