Your SlideShare is downloading. ×
  • Like
Symfony (1/3) | Train to Symfony
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Symfony (1/3) | Train to Symfony

  • 1,293 views
Published

Topic: Symfony …

Topic: Symfony
Language: italian (english version soon)
First of three presentations shown during the first edition of the Train to Symfony
Verona 13/14 April 2013

http://traintosymfony.com
http://twitter.com/TrainToSymfony

Emanuele Gaspari
https://twitter.com/inmarelibero

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,293
On SlideShare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
32
Comments
0
Likes
4

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. http://traintosymfony.com1Emanuele GaspariTRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:Symfony (1/3)
  • 2. http://traintosymfony.com2Emanuele Gaspariabout mecreatore di SymfonyBricksEmanuele Gaspariultimo sito pubblicato (copiaincolla): www.ilovesanmartino.it4 bundles21 controllers6 services9 entities5 repositories custom4 estensioni twig14 macros10 bundles aggiuntivi(FOSUserBundle, FOSJsRoutingBundle, KnpPaginatorBundle, CopiaincollaMetaTagsBundle, etc..)co-sviluppatore di CopiaincollaMetaTagsBundle https://github.com/copiaincolla/MetaTagsBundlehttps://symfonybricks.cominmarelibero@gmail.com @inmarelibero
  • 3. http://traintosymfony.com3Emanuele Gaspariprima parte:familiarità con i concetti di SymfonySymfony: teoria e codiceRouting Templatingoverview
  • 4. http://traintosymfony.com4Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 5. http://traintosymfony.com5Emanuele Gaspariun po di storiaS 1.0 → gennaio 2007S 1.2 → novembre 2008S 1.4 → novembre 2009S 2.0 → luglio 2011S 2.1 → settembre 2012S 2.2 → marzo 2013S 2.3 → maggio 2013 (LTS)Symfonyis a trademark of Fabien Potencier. All rights reserved.
  • 6. http://traintosymfony.com6Emanuele Gasparidef.Symfony2 è un insieme di componenti PHP riutilizzabili e indipendentiche risolvono problemi frequenti di sviluppo.Symfony Standard Distributionhttp://fabien.potencier.org/article/49/what-is-symfony2, 25 Ottobre 2011 http://symfony.com/it/doc/current/book/http_fundamentals.htmlSulla base di questi componenti, Symfony2 è anche un framework completo.
  • 7. http://traintosymfony.com7Emanuele Gasparigli attrezziSymfony è una cassetta degli attrezzi
  • 8. http://traintosymfony.com8Emanuele GaspariSymfony fornisce degli (ottimi) strumentiper gestire (molti) problemi ricorrentipersistenza dei dati sicurezza formvalidazione templating configurazionelogging gestione degli assets routingtraduzioni serializzazione console taskscaching invio di email etc...problemi ricorrenti
  • 9. http://traintosymfony.com9Emanuele Gasparia noi resta solo il divertimentoyeah!
  • 10. http://traintosymfony.com10Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 11. http://traintosymfony.com11Emanuele Gaspariframework, #Symfonyperché un framework●codice coperto da test(security audit 2011, 9.500 europer testare Symfony2, Doctrine e Twig)●flessibile●sicuro●è strutturato●manutenibile, sviluppo in team●aggiornabile●concentrarsi sul “business value”●codice di qualitàperché Symfony●Stable API●Long term support(S2.3 supportata fino al 2016)●community e risorse
  • 12. http://traintosymfony.com12Emanuele Gasparinon occuparsi di task ripetitivioffrire strumenti opzionaliper risolvereproblemi complessigoals
  • 13. http://traintosymfony.com13Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 14. http://traintosymfony.com14Emanuele Gaspariin Symfony ogni cosa è un bundlefunzionalità del corecodice di terze particodice dellapplicazione“In Symfony2, bundles are first-class citizens that are soflexible that even core code itself is a bundle.”http://symfony.com/doc/master/cookbook/symfony1.htmleverything is a bundle
  • 15. http://traintosymfony.com15Emanuele Gaspariun bundle è una cartellache contiene codice PHPpuò ospitare qualsiasi cosa●controllers●templates●assets javascript, css, immagini●classi varie●...ha una struttura ben definita,che alloccorrenza può esserepersonalizzata(vedi KnpRadBundle, http://rad.knplabs.com)https://github.com/inmarelibero/SymfonyBricksorganizzazione di un bundle
  • 16. http://traintosymfony.com16Emanuele Gaspariil core di Symfony e tutti i bundles aggiuntisuccessivamente vengono gestiti attraversoComposer$ php composer.phar install$ php composer.phar install$ php composer.phar update$ php composer.phar updateil file vendor/autoload.php carica in Symfony tutte le librerie installatehttp://getcomposer.orge installati nella cartella /vendorvendor
  • 17. http://traintosymfony.com17Emanuele Gasparicorecomponenti librerie esterne bundlesConfigConsoleFormHttpFoundationHttpKernelLocaleRoutingSecurityTemplatingTranslationValidatorYamlDoctrine ORMSwiftMailerTwigSensioFrameworkExtraBundleSensioGeneratorBundleJMSSecurityExtraBundleDoctrineFixturesBundleDoctrineMigrationsBundleDoctrineMongoDBBundleil core di Symfony (elenco ampiamente parziale)
  • 18. http://traintosymfony.com18Emanuele Gaspariconfigurazionecomponenti di Symfonylibrerie di terze partiorganizzato in bundlesbundles dellutentedocument root dellapplicazionecontrollerstemplates, javascript, cssfront controllersstruttura di unapplicazione
  • 19. http://traintosymfony.com19Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 20. http://traintosymfony.com20Emanuele GaspariPHP 5.3S 2.0 >= 5.3.2S 2.1 >= 5.3.3S 2.2 >= 5.3.3PHP 5.3.0 è stato rilasciato nel giugno 2009namespacesfunzioni lambda/closuresgarbage collectionSymfony2 richiede come minimola versione 5.3.2 di PHP
  • 21. http://traintosymfony.com21Emanuele Gaspari# /var/www/vhosts/traintosymfony/src/Foo/BarBundle/Controller/DefaultController.php<?phpnamespace FooBarBundleController;use SymfonyBundleFrameworkBundleControllerController;use SymfonyComponentHttpFoundationResponse;class DefaultController extends Controller{public function indexAction(){return new Response("Hello");}}# /var/www/vhosts/traintosymfony/src/Foo/BarBundle/Controller/DefaultController.php<?phpnamespace FooBarBundleController;use SymfonyBundleFrameworkBundleControllerController;use SymfonyComponentHttpFoundationResponse;class DefaultController extends Controller{public function indexAction(){return new Response("Hello");}}PSR-0https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.mdnamespaces/var/www/vhosts/traintosymfony/src/Foonamespace Foo
  • 22. http://traintosymfony.com22Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 23. http://traintosymfony.com23Emanuele Gaspariil nostro lavoroil nostro lavoro è quello di sviluppareapplicazioni webche gestiscanorichieste HTTPe producano unarisposta
  • 24. http://traintosymfony.com24Emanuele Gaspari
  • 25. http://traintosymfony.com25Emanuele GasparihelpSymfony ti aiuta esattamente a fare questo
  • 26. http://traintosymfony.com26Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 27. http://traintosymfony.com27Emanuele Gasparifront controlleril front controller è lunico punto di accesso allapplicazione dallesternosi occupa di fare il bootstrap dellapplicazione (kernel),interrogare il controller e restituire una risposta/app.php /app_dev.php
  • 28. http://traintosymfony.com28Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 29. http://traintosymfony.com29Emanuele Gaspariflusso di unapplicazione Symfony 1/3il client invia una richiesta che viene ricevuta dal Front Controller (app.php)il front controller crea e gestisce un oggetto di tipo Request
  • 30. http://traintosymfony.com30Emanuele Gaspariflusso di unapplicazione Symfony 2/3attraverso il sistema di Routing, Symfony individuaun Controller e una Action da eseguire a seconda dellurl
  • 31. http://traintosymfony.com31Emanuele Gaspariflusso di unapplicazione Symfony 3/3viene eseguita unazione, che restituisce una risposta al client (html, xml, json)le azioni restituiscono SEMPRE un oggetto di tipo Response
  • 32. http://traintosymfony.com32Emanuele Gaspariflusso completorichiestabootstrap (del kernel)dellapplicazioneSymfonyFront Controller(app.php)Controller rispostabrowser browser
  • 33. http://traintosymfony.com33Emanuele Gaspari# /var/www/vhosts/traintosymfony/web/app.php<?phpuse SymfonyComponentHttpFoundationRequest;$loader = require_once __DIR__./../app/bootstrap.php.cache;require_once __DIR__./../app/AppKernel.php;$kernel = new AppKernel(prod, false);$kernel->loadClassCache();$request = Request::createFromGlobals();$response = $kernel->handle($request);$response->send();$kernel->terminate($request, $response);# /var/www/vhosts/traintosymfony/web/app.php<?phpuse SymfonyComponentHttpFoundationRequest;$loader = require_once __DIR__./../app/bootstrap.php.cache;require_once __DIR__./../app/AppKernel.php;$kernel = new AppKernel(prod, false);$kernel->loadClassCache();$request = Request::createFromGlobals();$response = $kernel->handle($request);$response->send();$kernel->terminate($request, $response);il Front Controller gestisce la richiesta: il metodo handle()kernel handle
  • 34. http://traintosymfony.com34Emanuele Gaspari
  • 35. http://traintosymfony.com35Emanuele Gasparifacciamo il puntocreare una Route che associ un url ad unazione contenuta in un Controllerfare in modo che lazione restituisca una risposta, tipicamente dopo avereseguito delle operazionise la risposta è html, stampare un template TWIG
  • 36. http://traintosymfony.com36Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 37. http://traintosymfony.com37Emanuele GaspariHTTPHTTPnon importa con quali strumenti e in che modo sviluppi per il web,lobiettivo è SEMPREdi interpretare una richiesta e fornire una rispostalinguaggio testuale che permette a due macchine di comunicare1.1 RFC 2616/1999
  • 38. http://traintosymfony.com38Emanuele Gasparilo schema seguente rappresenta tutta la complessità di una richiesta HTTP 1.1presta molta attenzioneATTENZIONE!warning
  • 39. http://traintosymfony.com39Emanuele GaspariHTTPrichiestarispostaclient SERVERThe HTTP protocol is a request/response protocol. A client sends a request to the server in the form of a request method, URI, and protocol version,followed by a MIME-like message containing request modifiers, client information, and possible body content over a connection with a server. Theserver responds with a status line, including the messages protocol version and a success or error code, followed by a MIME-like message containingserver information, entity metainformation, and possible entity-body content.http://tools.ietf.org/html/rfc2068
  • 40. http://traintosymfony.com40Emanuele Gaspariok, lo sapevograzie, lo sapevo già(o forse no)
  • 41. http://traintosymfony.com41Emanuele Gasparibodyuna richiesta HTTPhttp://www.symfony.comhttp://www.symfony.com
  • 42. http://traintosymfony.com42Emanuele GaspariobiettiviHTTP è uno standard e funziona molto beneè importante ricordarsi da dove si parte e cosa si vuole ottenereLadesione allo standard HTTP è un obiettivo di Symfony2
  • 43. http://traintosymfony.com43Emanuele Gasparila filosofia“Symfony è progettato per soddisfare questa realtà.”"Se Symfony non offrisse altro, avresti comunque un kit di strumentiper un facile accesso alle informazioni di richiestae uninterfaccia object-oriented per la creazione della risposta.[...] lobiettivo della tua applicazione è sempre quello diinterpretare una richiesta e creare la risposta appropriata in base alla logicadellapplicazione."http://symfony.com/doc/current/book/http_fundamentals.html
  • 44. http://traintosymfony.com44Emanuele Gasparifinora non ho avuto (particolari) problemi con$_GET, $_SERVER, etc..perché dovrei usare Symfony per la gestione di ogni richiesta?Request ResponseSymfony modella la richiesta e la risposta HTTP con le due classi PHPgestire le richieste
  • 45. http://traintosymfony.com45Emanuele Gaspariun solo esempio può essere sufficiente
  • 46. http://traintosymfony.com46Emanuele Gasparistring(35) "it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4"string(35) "it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4"// Contents of the Accept-Language: header from the current request, if there is one.$languages = $_SERVER[HTTP_ACCEPT_LANGUAGE];var_dump($languages);// Contents of the Accept-Language: header from the current request, if there is one.$languages = $_SERVER[HTTP_ACCEPT_LANGUAGE];var_dump($languages);HTTP_ACCEPT_LANGUAGEhttp://php.net/manual/en/reserved.variables.server.php
  • 47. http://traintosymfony.com47Emanuele Gaspariarray(4) {[0]=> string(5) "it_IT"[1]=> string(2) "it"[2]=> string(5) "en_US"[3]=> string(2) "en"}array(4) {[0]=> string(5) "it_IT"[1]=> string(2) "it"[2]=> string(5) "en_US"[3]=> string(2) "en"}// Gets a list of languages acceptable by the client browser$languages = $this->getRequest()->getLanguages();var_dump($languages);// Gets a list of languages acceptable by the client browser$languages = $this->getRequest()->getLanguages();var_dump($languages);getLanguages()http://api.symfony.com/2.0/Symfony/Component/HttpFoundation/Request.html#method_getLanguages
  • 48. http://traintosymfony.com48Emanuele Gasparinon re-inventare la ruotanon occuparsi di task ripetitiviABOUT: “Freddie Mercury Rage Pose” is a rage comic character made from a photo of the lead vocalist Freddie Mercury. The image is typically used to indicate that an extraordinaryfeat has been accomplished, similar to the Fuck Yeah illustration.Freddie Mercury Rage Pose
  • 49. http://traintosymfony.com49Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 50. http://traintosymfony.com50Emanuele Gasparivorrei mostrare agli utenti dei clean urls (il più possibile)posizionamento sui motori di ricercaunivocità dellindirizzo webgli url “parlanti” migliorano la comunicazione/prodotto?codice=EG-124 /prodotto/EG-124clean urls
  • 51. http://traintosymfony.com51Emanuele GaspariWordpress dà la possibilità di scegliere il formato dellurl di un post:wordpress
  • 52. http://traintosymfony.com52Emanuele Gasparigestire gli urlCome sviluppatore vorrei un (buon) sistema per gestire url “parlanti”flessibilità: quanto mi costerebbe cambiare un url da /news a /press?nei templates HTML, al posto degli url vorrei usare dei segnapostovorrei che gli url fossero “generati”debug
  • 53. http://traintosymfony.com53Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 54. http://traintosymfony.com54Emanuele Gaspari# app/config/routing.ymlprodotto_show:path: /prodotto/{codice}defaults: { _controller: TtsDemoBundle:Prodotto:show}# app/config/routing.ymlprodotto_show:path: /prodotto/{codice}defaults: { _controller: TtsDemoBundle:Prodotto:show}in Symfony una Route è unassociazione traun url e un Controller, tramite il parametro pathclass ProdottoController{public function showAction($codice) { […] }}class ProdottoController{public function showAction($codice) { […] }}/prodotto/EG-124/prodotto/DF-14/prodotto/SSX-01/prodotto/EG-124/prodotto/DF-14/prodotto/SSX-01RouteUrls ControllerRoutes
  • 55. http://traintosymfony.com55Emanuele Gaspariprodotto_show:path: /prodotto/{codice}defaults: { _controller: TtsDemoBundle:Prodotto:show}Route namepathController e Action (nome logico)una Route
  • 56. http://traintosymfony.com56Emanuele GaspariGET /prodotto/EG-124GET /prodotto/EG-27GET /prodotto/EG-74GET /prodotto/EG-124GET /prodotto/EG-27GET /prodotto/EG-74alcuni esempi di RoutesGET /GET /GET /catalogoGET /catalogoprodotto_show:path: /prodotto/{codice}defaults: [...]prodotto_show:path: /prodotto/{codice}defaults: [...]catalogo_index:path: /catalogodefaults: [...]catalogo_index:path: /catalogodefaults: [...]homepage:path: /defaults: [...]homepage:path: /defaults: [...]url e path
  • 57. http://traintosymfony.com57Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 58. http://traintosymfony.com58Emanuele GaspariTWIGSymfony usa TWIG come linguaggio e motore di templating pergenerare contenuto HTMLTWIG permette di scrivere templates concisi e leggibili, sia dasviluppatori che da web designersoffre anche funzionalità avanzate utilizzabili in modo sempliceThe Twig logo is © 2010-2012 Sensio Labs
  • 59. http://traintosymfony.com59Emanuele Gaspariesempio<ul>{% for item in menu_links %}<li><a href="{{ item.href }}">{{ item.label }}</a></li>{% endfor %}</ul><ul>{% for item in menu_links %}<li><a href="{{ item.href }}">{{ item.label }}</a></li>{% endfor %}</ul>uno dei punti di forza di TWIG è la leggibilità
  • 60. http://traintosymfony.com60Emanuele GaspariintroSymfony2: what?usare un frameworkSymfony internalsnamespacesRequest e ResponseFront Controllerflusso di unapplicazioneHTTPRoutingclean urlsRoutes in SymfonyTemplatingTWIGrisposta HTMLOVERVIEW
  • 61. http://traintosymfony.com61Emanuele Gasparirisposta HTMLnella terza fase del flusso request/response lazione produce una risposta
  • 62. http://traintosymfony.com62Emanuele Gasparirisposta HTML●gestito la richiesta che arriva allapplicazione●analizzato i parametri di ingresso (GET, POST, SESSION, etc..)●utilizzato le risorse necessarie●eseguito delle operazioni●preparato i dati per la rispostadopo che lazione ha:...il passaggio successivo è preparare il contenuto HTML per il client
  • 63. http://traintosymfony.com63Emanuele Gasparitemplate twigviene convertito (quasi sempre) in HTML per produrre il bodydella risposta da restituire al client●lazione “sceglie” un template●si passano (opzionalmente) delle variabili al template●TWIG effettua il parsing, generando HTML●la risposta viene inviata al clientin Symfony un template è semplicemente un file di testocontenente tag HTML e blocchi di sintassi TWIG
  • 64. TRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:©Copyright Emanuele Gaspari Castelletti