http://traintosymfony.com1Emanuele GaspariTRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.c...
http://traintosymfony.com2Emanuele Gaspariabout mecreatore di SymfonyBricksEmanuele Gaspariultimo sito pubblicato (copiain...
http://traintosymfony.com3Emanuele GaspariSymfony: teoria e codiceRouting Templatingframeworkshop: il programmaoverviewobi...
http://traintosymfony.com4Emanuele GaspariRoutingil Routing è il meccanismo di associazione tra url e controllers
http://traintosymfony.com5Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Rou...
http://traintosymfony.com6Emanuele GaspariControllerSymfonyBundleFrameworkBundleControllerController●riceve i parametri●es...
http://traintosymfony.com7Emanuele Gaspari●funzione definita allinterno di un controller●la firma ha la sintassi public fu...
http://traintosymfony.com8Emanuele Gaspariactions: esempi# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespa...
http://traintosymfony.com9Emanuele Gaspariscopo di unazionelo scopo di unazione è di preparare i datiche verranno mostrati...
http://traintosymfony.com10Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com11Emanuele Gaspariuna Route è unassociazione tra url e controller che specifico:Route: tra url e ...
http://traintosymfony.com12Emanuele Gaspari# app/config/routing.ymlhomepage:path: /defaults: { _controller: TtsDemoBundle:...
http://traintosymfony.com13Emanuele Gaspari# app/config/routing.ymlindex_catalogo:path: /catalogodefaults: { _controller: ...
http://traintosymfony.com14Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com15Emanuele Gasparistabilisco che una parte del path è variabileRoutes {parametriche}le parti vari...
http://traintosymfony.com16Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpnamespace TtsDemoBun...
http://traintosymfony.com17Emanuele Gaspari# app/config/routing.ymlprodotto_show:path: /prodotto/{categoria}/{codice}/{slu...
http://traintosymfony.com18Emanuele GaspariGET /prodotto/147?mobile_layout=trueGET /prodotto/147?mobile_layout=true# app/c...
http://traintosymfony.com19Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com20Emanuele Gasparial posto di definire una Route per ogni (sintassi di) url in un file ymlposso u...
http://traintosymfony.com21Emanuele Gaspari=# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespace TtsDemoBun...
http://traintosymfony.com22Emanuele Gaspari# app/config/routing.ymlindex_catalogo:path: /catalogodefaults: { _controller: ...
http://traintosymfony.com23Emanuele Gaspari# app/config/routing.ymlprodotto_show:path: /prodotto/{codice}defaults: { _cont...
http://traintosymfony.com24Emanuele Gaspari# app/config/routing.ymlprodotto_show:path: /prodotto/{categoria}/{codice}/{slu...
http://traintosymfony.com25Emanuele Gasparidefinisco in app/config/routing.yml quali controller caricare
http://traintosymfony.com26Emanuele Gasparitype: annotation# app/config/config.yml# TtsDemoBundle Default controllerdefaul...
http://traintosymfony.com27Emanuele Gasparitype: annotation (2)# app/config/config.yml# TtsDemoBundletts_demo:resource: “@...
http://traintosymfony.com28Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com29Emanuele Gasparibest practicefar corrispondere ad ogni url una sola route
http://traintosymfony.com30Emanuele GaspariGET /prodotto/EG-124 => prodotto_showGET /prodotto/index => prodotto_show, prod...
http://traintosymfony.com31Emanuele Gasparisfrutto lordine con cui vengono definite le Routesil controller si ferma alla p...
http://traintosymfony.com32Emanuele Gasparirimane ancora il problema della collisione di urls verso più di una Routebasars...
http://traintosymfony.com33Emanuele Gasparisfrutto il parametro requirements# app/config/routing.ymlprodotto_show:path: /p...
http://traintosymfony.com34Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com35Emanuele GaspariSymfony associa il nome logico ad unaspecifica classe e metodo (Controller e Ac...
http://traintosymfony.com36Emanuele GaspariTtsDemoBundle:Default:homepageBundle Controller MetodoTtsDemoBundleTtsDemoBundl...
http://traintosymfony.com37Emanuele Gaspari# template twig{{ render(controller(“TtsDemoBundle:Blog:latestPosts”, {“max”: 5...
http://traintosymfony.com38Emanuele Gaspari$ php app/console router:debug$ php app/console router:debug$ php app/console r...
http://traintosymfony.com39Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com40Emanuele Gasparioggetto RequestSymfonyComponentHttpFoundationRequestoggetto che ho a disposizio...
http://traintosymfony.com41Emanuele Gaspariaccedere ad un oggetto Request<?phppublic function homepageAction(){$request = ...
http://traintosymfony.com42Emanuele Gasparipanoramica$_GET$request->query$_POST$request->request$_COOKIE$request->cookies$...
http://traintosymfony.com43Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com44Emanuele Gaspari/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/pub...
http://traintosymfony.com45Emanuele Gasparidefaults (1)200 GET /prodotto/nuovi/EG-124/eg-124-new-hammer200 GET /prodotto/n...
http://traintosymfony.com46Emanuele Gaspariaccesso ai parametri200 GET /prodotto/nuovi/EG-124/eg-124-new-hammer?color=red2...
http://traintosymfony.com47Emanuele Gaspari?get= o /{param}●parametro essenziale?●eleganza degli url●cambio successivo deg...
http://traintosymfony.com48Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com49Emanuele GaspariResponseogni Action restituisce sempre un oggetto Responsereal life: molte volt...
http://traintosymfony.com50Emanuele Gasparireturn arrayla situazione più semplice è quella in cui utilizzolannotation @Tem...
http://traintosymfony.com51Emanuele Gasparireturn array# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse Symf...
http://traintosymfony.com52Emanuele Gasparirender()posso fare in modo che lazione restituisca un template TWIG compilato,a...
http://traintosymfony.com53Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpclass ProdottoContro...
http://traintosymfony.com54Emanuele Gasparicostruire una Responseè possibile anche costruire un oggetto Responseutile nel ...
http://traintosymfony.com55Emanuele Gasparicostruire una Responseutilizzo la funzione $this->renderView() per memorizzareu...
http://traintosymfony.com56Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyComponent...
http://traintosymfony.com57Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyComponent...
http://traintosymfony.com58Emanuele Gasparijsonanche restituire una risposta in formato json è semplice
http://traintosymfony.com59Emanuele Gasparijson Response# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse Sym...
http://traintosymfony.com60Emanuele Gaspaririassunto●un array●$this->render()●$this->renderView()●un oggetto Response●un o...
http://traintosymfony.com61Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com62Emanuele Gaspariredirectil redirect è un messaggio al browsercambia lurl perché è effettivament...
http://traintosymfony.com63Emanuele Gaspariredirect temporaneo# src/Tts/DemoBundle/Controller/DefaultController.php<?phpcl...
http://traintosymfony.com64Emanuele GaspariRedirectResponsecè un oggetto dedicato (che sorpresa!) che la Action puòrestitu...
http://traintosymfony.com65Emanuele GaspariRedirectResponse# src/Tts/DemoBundle/Controller/DefaultController.php<?phpuse S...
http://traintosymfony.com66Emanuele Gaspari# src/Tts/DemoBundle/Controller/DefaultController.php<?phpclass DefaultControll...
http://traintosymfony.com67Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Ro...
http://traintosymfony.com68Emanuele Gasparilazione può passare delle variabili al template restituendo un arraypublic func...
TRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:©Copyright ...
Upcoming SlideShare
Loading in …5
×

Routing (2/3) | Train to Symfony

1,381 views

Published on

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

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

No Downloads
Views
Total views
1,381
On SlideShare
0
From Embeds
0
Number of Embeds
24
Actions
Shares
0
Downloads
34
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Routing (2/3) | Train to Symfony

  1. 1. http://traintosymfony.com1Emanuele GaspariTRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:Routing (2/3)
  2. 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. 3. http://traintosymfony.com3Emanuele GaspariSymfony: teoria e codiceRouting Templatingframeworkshop: il programmaoverviewobiettivo della seconda parte:il sistema di Routing in Symfony
  4. 4. http://traintosymfony.com4Emanuele GaspariRoutingil Routing è il meccanismo di associazione tra url e controllers
  5. 5. http://traintosymfony.com5Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  6. 6. http://traintosymfony.com6Emanuele GaspariControllerSymfonyBundleFrameworkBundleControllerController●riceve i parametri●esegue delle operazioni e restituisce una rispostain Symfony un Controller è una classe PHP che estende la classetask comuni: passaggio di variabili ai templates,accesso a “servizi”, comunicazione con database, redirect
  7. 7. http://traintosymfony.com7Emanuele Gaspari●funzione definita allinterno di un controller●la firma ha la sintassi public function ...Action()nel Controller vengono definite leactions (azioni)Action
  8. 8. http://traintosymfony.com8Emanuele Gaspariactions: esempi# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;class DefaultController extends Controller{public function homepageAction(){[...]}public function contattiAction(){[...]}public function chiSiamoAction(){[...]}}# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;class DefaultController extends Controller{public function homepageAction(){[...]}public function contattiAction(){[...]}public function chiSiamoAction(){[...]}}
  9. 9. http://traintosymfony.com9Emanuele Gaspariscopo di unazionelo scopo di unazione è di preparare i datiche verranno mostrati nel templatele azioni non dovrebbero essere molto estesese unazione lo è, chiediti se la logica debba essereridistribuita in altri servizi, repository, entities
  10. 10. http://traintosymfony.com10Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  11. 11. http://traintosymfony.com11Emanuele Gaspariuna Route è unassociazione tra url e controller che specifico:Route: tra url e Controller●in app/config/routing.yml●in un altro file yml●nel controller
  12. 12. http://traintosymfony.com12Emanuele Gaspari# app/config/routing.ymlhomepage:path: /defaults: { _controller: TtsDemoBundle:Default:homepage }# app/config/routing.ymlhomepage:path: /defaults: { _controller: TtsDemoBundle:Default:homepage }# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;class DefaultController extends Controller{public function homepageAction(){return $this->render(TtsDemoBundle:Default:homepage.html.twig);}}# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;class DefaultController extends Controller{public function homepageAction(){return $this->render(TtsDemoBundle:Default:homepage.html.twig);}}/
  13. 13. http://traintosymfony.com13Emanuele Gaspari# app/config/routing.ymlindex_catalogo:path: /catalogodefaults: { _controller: TtsDemoBundle:Catalogo:index }# app/config/routing.ymlindex_catalogo:path: /catalogodefaults: { _controller: TtsDemoBundle:Catalogo:index }# src/Tts/DemoBundle/Controller/CatalogoController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;class CatalogoController extends Controller{public function indexAction(){[...]}}# src/Tts/DemoBundle/Controller/CatalogoController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;class CatalogoController extends Controller{public function indexAction(){[...]}}/catalogo
  14. 14. http://traintosymfony.com14Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  15. 15. http://traintosymfony.com15Emanuele Gasparistabilisco che una parte del path è variabileRoutes {parametriche}le parti variabili sono comprese tra { } e vengono passateallazione come argomenti
  16. 16. http://traintosymfony.com16Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpnamespace TtsDemoBundleController;use SmfonyBundleFrameworkBundleControllerController;class ProdottoController extends Controller{public function showAction($codice){$em = $this->getDoctrine()->getManager();$entity = $em->getRepository(TtsDemoBundle:Prodotto)->find($codice);[...]}}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpnamespace TtsDemoBundleController;use SmfonyBundleFrameworkBundleControllerController;class ProdottoController extends Controller{public function showAction($codice){$em = $this->getDoctrine()->getManager();$entity = $em->getRepository(TtsDemoBundle:Prodotto)->find($codice);[...]}}# 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 }/prodotto/{codice}
  17. 17. http://traintosymfony.com17Emanuele Gaspari# app/config/routing.ymlprodotto_show:path: /prodotto/{categoria}/{codice}/{slug}defaults: { _controller: TtsDemoBundle:Prodotto:show }# app/config/routing.ymlprodotto_show:path: /prodotto/{categoria}/{codice}/{slug}defaults: { _controller: TtsDemoBundle:Prodotto:show }/prodotto/{categoria}/{codice}/{slug}
  18. 18. http://traintosymfony.com18Emanuele GaspariGET /prodotto/147?mobile_layout=trueGET /prodotto/147?mobile_layout=true# 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 }<?phppublic function showAction($codice){$request = $this->getRequest();$mobileLayout = $request->get(mobile_layout);// oppure, più estesamente$mobileLayout = $request->query->get(mobile_layout, false);[…]}<?phppublic function showAction($codice){$request = $this->getRequest();$mobileLayout = $request->get(mobile_layout);// oppure, più estesamente$mobileLayout = $request->query->get(mobile_layout, false);[…]}passaggio di parametri $_GET
  19. 19. http://traintosymfony.com19Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  20. 20. http://traintosymfony.com20Emanuele Gasparial posto di definire una Route per ogni (sintassi di) url in un file ymlposso usare lannotazione @Route direttamente nel controller
  21. 21. http://traintosymfony.com21Emanuele Gaspari=# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;class DefaultController extends Controller{/*** @Route("/", name=”homepage”)*/public function homepageAction() {[...]}}# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;class DefaultController extends Controller{/*** @Route("/", name=”homepage”)*/public function homepageAction() {[...]}}# app/config/routing.ymlhomepage:path: /defaults: { _controller: TtsDemoBundle:Default:homepage }
  22. 22. http://traintosymfony.com22Emanuele Gaspari# app/config/routing.ymlindex_catalogo:path: /catalogodefaults: { _controller: TtsDemoBundle:Catalogo:index }# src/Tts/DemoBundle/Controller/CatalogoController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;class CatalogoController extends Controller{/*** @Route("/catalogo", name=”index_catalogo”)*/public function indexAction() {[...]}}# src/Tts/DemoBundle/Controller/CatalogoController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;class CatalogoController extends Controller{/*** @Route("/catalogo", name=”index_catalogo”)*/public function indexAction() {[...]}}=
  23. 23. http://traintosymfony.com23Emanuele Gaspari# app/config/routing.ymlprodotto_show:path: /prodotto/{codice}defaults: { _controller: TtsDemoBundle:Prodotto:show }# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;class ProdottoController extends Controller{/*** @Route("/prodotto/{codice}", name=”prodotto_show”)*/public function showAction($codice) {[...]}}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;class ProdottoController extends Controller{/*** @Route("/prodotto/{codice}", name=”prodotto_show”)*/public function showAction($codice) {[...]}}=
  24. 24. http://traintosymfony.com24Emanuele Gaspari# app/config/routing.ymlprodotto_show:path: /prodotto/{categoria}/{codice}/{slug}defaults: { _controller: TtsDemoBundle:Prodotto:show }# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;class ProdottoController extends Controller{/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($categoria, $codice, $slug) {[...]}}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;class ProdottoController extends Controller{/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($categoria, $codice, $slug) {[...]}}=
  25. 25. http://traintosymfony.com25Emanuele Gasparidefinisco in app/config/routing.yml quali controller caricare
  26. 26. http://traintosymfony.com26Emanuele Gasparitype: annotation# app/config/config.yml# TtsDemoBundle Default controllerdefault:resource: “@TtsDemoBundle/Controller/DefaultController.php”type: annotation# TtsDemoBundle Catalogo controllercatalogo:resource: “@TtsDemoBundle/Controller/CatalogoController.php”type: annotation# TtsDemoBundle Prodotto controllerprodotto:resource: “@TtsDemoBundle/Controller/ProdottoController.php”type: annotation# app/config/config.yml# TtsDemoBundle Default controllerdefault:resource: “@TtsDemoBundle/Controller/DefaultController.php”type: annotation# TtsDemoBundle Catalogo controllercatalogo:resource: “@TtsDemoBundle/Controller/CatalogoController.php”type: annotation# TtsDemoBundle Prodotto controllerprodotto:resource: “@TtsDemoBundle/Controller/ProdottoController.php”type: annotation
  27. 27. http://traintosymfony.com27Emanuele Gasparitype: annotation (2)# app/config/config.yml# TtsDemoBundletts_demo:resource: “@TtsDemoBundle/Controller/”type: annotation# app/config/config.yml# TtsDemoBundletts_demo:resource: “@TtsDemoBundle/Controller/”type: annotationo, semplicemente, specifico la cartella che li contiene tutti
  28. 28. http://traintosymfony.com28Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  29. 29. http://traintosymfony.com29Emanuele Gasparibest practicefar corrispondere ad ogni url una sola route
  30. 30. http://traintosymfony.com30Emanuele GaspariGET /prodotto/EG-124 => prodotto_showGET /prodotto/index => prodotto_show, prodotto_index# app/config/routing.ymlprodotto_show:path: /prodotto/{codice}defaults: { _controller: TtsDemoBundle:Prodotto:show }prodotto_index:path: /prodotto/indexdefaults: { _controller: TtsDemoBundle:Prodotto:index }# app/config/routing.ymlprodotto_show:path: /prodotto/{codice}defaults: { _controller: TtsDemoBundle:Prodotto:show }prodotto_index:path: /prodotto/indexdefaults: { _controller: TtsDemoBundle:Prodotto:index }collisione di urls
  31. 31. http://traintosymfony.com31Emanuele Gasparisfrutto lordine con cui vengono definite le Routesil controller si ferma alla prima Route abbinata allurlè sufficiente definire prima la Route che non contiene parametriGET /prodotto/indexGET /prodotto/EG-124# app/config/routing.ymlprodotto_index:path: /prodotto/indexprodotto_show:path: /prodotto/{codice}# app/config/routing.ymlprodotto_index:path: /prodotto/indexprodotto_show:path: /prodotto/{codice}soluzione 1, ordine delle Routes
  32. 32. http://traintosymfony.com32Emanuele Gasparirimane ancora il problema della collisione di urls verso più di una Routebasarsi sullordine con cui vengono esaminate le Routes non è sufficiente:dopo un anno che il sito è in produzione, mi ricordo che laposizione di quella specifica Route è vitale?anche usando lannotazione @Route, posso non volere cheallinterno di un Controller una funzione venga spostatain alto solo perché la Route venga esaminata primalordine non basta
  33. 33. http://traintosymfony.com33Emanuele Gasparisfrutto il parametro requirements# app/config/routing.ymlprodotto_show:path: /prodotto/{codice}requirements:codice: [A-Z]{2}-[0-9]+prodotto_index:path: /prodotto/index# app/config/routing.ymlprodotto_show:path: /prodotto/{codice}requirements:codice: [A-Z]{2}-[0-9]+prodotto_index:path: /prodotto/indexGET /prodotto/indexGET /prodotto/EG-124non cè più collisione tra Routesnon mi affido più allordine di caricamentosoluzione 2, parametro requirementspongo dei vincoli sul formato di un parametro di una Route
  34. 34. http://traintosymfony.com34Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  35. 35. http://traintosymfony.com35Emanuele GaspariSymfony associa il nome logico ad unaspecifica classe e metodo (Controller e Action)bundle:controller:actionnome logico di un Controllersintassi per riferirsi ad unazione da qualunque punto dellapplicazioneController Naming Pattern
  36. 36. http://traintosymfony.com36Emanuele GaspariTtsDemoBundle:Default:homepageBundle Controller MetodoTtsDemoBundleTtsDemoBundle DefaultControllerDefaultController homepageAction()homepageAction()# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;class DefaultController extends Controller{public function homepageAction(){[…]}}# src/Tts/DemoBundle/Controller/DefaultController.php<?phpnamespace TtsDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;class DefaultController extends Controller{public function homepageAction(){[…]}}Controller Naming Pattern
  37. 37. http://traintosymfony.com37Emanuele Gaspari# template twig{{ render(controller(“TtsDemoBundle:Blog:latestPosts”, {“max”: 5})) }}# template twig{{ render(controller(“TtsDemoBundle:Blog:latestPosts”, {“max”: 5})) }}esempio
  38. 38. http://traintosymfony.com38Emanuele Gaspari$ php app/console router:debug$ php app/console router:debug$ php app/console router:match /prodotto/EG-124$ php app/console router:match /prodotto/EG-124tipsstampare a console lelenco di tutte le Routes caricateverificare se un path è associato da Symfony ad una Route
  39. 39. http://traintosymfony.com39Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  40. 40. http://traintosymfony.com40Emanuele Gasparioggetto RequestSymfonyComponentHttpFoundationRequestoggetto che ho a disposizione allinterno di ogni azioneper gestire tutti i parametri della richiestaSymfony utilizza un oggetto Request per modellare una richiesta HTTP
  41. 41. http://traintosymfony.com41Emanuele Gaspariaccedere ad un oggetto Request<?phppublic function homepageAction(){$request = $this->getRequest();}<?phppublic function homepageAction(){$request = $this->getRequest();}use SymfonyComponentHttpFoundationRequest;$request = Request::createFromGlobals();use SymfonyComponentHttpFoundationRequest;$request = Request::createFromGlobals();accedere a Request in una Action:accedere a Request da qualunque punto dellapplicazione (in PHP):$this->getRequest() => 0.04 KbRequest::createFromGlobals() => 7.07 Kb{{ app.request }}{{ app.request }}accedere a Request da twig:
  42. 42. http://traintosymfony.com42Emanuele Gasparipanoramica$_GET$request->query$_POST$request->request$_COOKIE$request->cookies$_FILE$request->files$_SERVER$request->serverhttp://api.symfony.com/master/Symfony/Component/HttpFoundation/Request.html$request->getPathInfo() ->getMethod() ->getLanguages()->getRequestUri() ->getClientIp() ->getPreferredLanguage()->getScriptName() ->getSession() ->isXmlHttpRequest()
  43. 43. http://traintosymfony.com43Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  44. 44. http://traintosymfony.com44Emanuele Gaspari/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug, $categoria){[...]}/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug, $categoria){[...]}url con parametri200 GET /prodotto/nuovi/EG-124/eg-124-new-hammernon importa lordinepossono non essere specificati tuttilordine è importante, per associare i parametri dellurl404 GET /prodotto/nuovi/EG-124404 GET /prodotto/nuovi/EG-124/
  45. 45. http://traintosymfony.com45Emanuele Gasparidefaults (1)200 GET /prodotto/nuovi/EG-124/eg-124-new-hammer200 GET /prodotto/nuovi/EG-124404 GET /prodotto/nuovi/EG-124//*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”,defaults={“slug”: “-”})*/public function showAction($codice, $categoria, $slug) { [...] }/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”,defaults={“slug”: “-”})*/public function showAction($codice, $categoria) { [...] }/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $categoria, $slug = “-”) { [...] }/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”,defaults={“slug”: “-”})*/public function showAction($codice, $categoria, $slug) { [...] }/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”,defaults={“slug”: “-”})*/public function showAction($codice, $categoria) { [...] }/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $categoria, $slug = “-”) { [...] }
  46. 46. http://traintosymfony.com46Emanuele Gaspariaccesso ai parametri200 GET /prodotto/nuovi/EG-124/eg-124-new-hammer?color=red200 GET /prodotto/nuovi/EG-124?color=red/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug = “-”, $categoria){$request = $this->getRequest();// nellurl$codice;$codice = $request->get(“codice”);// in $_GET$color = $request->get(“color”);$color = $request->query->get(“color”);[...]}/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug = “-”, $categoria){$request = $this->getRequest();// nellurl$codice;$codice = $request->get(“codice”);// in $_GET$color = $request->get(“color”);$color = $request->query->get(“color”);[...]}
  47. 47. http://traintosymfony.com47Emanuele Gaspari?get= o /{param}●parametro essenziale?●eleganza degli url●cambio successivo degli url●indicizzazione dei motori di ricerca●multilinguaquando passare un parametro come?get=e quando come/{param}
  48. 48. http://traintosymfony.com48Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  49. 49. http://traintosymfony.com49Emanuele GaspariResponseogni Action restituisce sempre un oggetto Responsereal life: molte volte la Action che implementerai restituiràsemplicemente un array di variabili, utilizzabiliin un template che viene scelto più o meno “automaticamente”
  50. 50. http://traintosymfony.com50Emanuele Gasparireturn arrayla situazione più semplice è quella in cui utilizzolannotation @Template e la mia Action restituiscesemplicemente un array
  51. 51. http://traintosymfony.com51Emanuele Gasparireturn array# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;use SensioBundleFrameworkExtraBundleConfigurationTemplate;class ProdottoController extends Controller{/*** @Route(“/prodotto/{categoria}/{codice}/{slug}”, name=”prodotto_show”)* @Template()*/public function showAction($codice, $slug, $categoria){$entity = $this->getRepository(TtsDemoBundle:Prodotto)->findOneBy(array(“codice” => $codice));return array(entity => $entity);}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;use SensioBundleFrameworkExtraBundleConfigurationTemplate;class ProdottoController extends Controller{/*** @Route(“/prodotto/{categoria}/{codice}/{slug}”, name=”prodotto_show”)* @Template()*/public function showAction($codice, $slug, $categoria){$entity = $this->getRepository(TtsDemoBundle:Prodotto)->findOneBy(array(“codice” => $codice));return array(entity => $entity);}
  52. 52. http://traintosymfony.com52Emanuele Gasparirender()posso fare in modo che lazione restituisca un template TWIG compilato,ad esempio perché è diverso in base alla logica interna dellazioneutlizzo la funzione $this->render() specificando il template
  53. 53. http://traintosymfony.com53Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpclass ProdottoController extends Controller{/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug, $categoria){$entity = $this->getRepository(TtsDemoBundle:Prodotto)->findOneBy(array(“codice” => $codice));return $this->render(TtsDemoBundle:Prodotto:show_offer.html.twig, array(entity => $entity));}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpclass ProdottoController extends Controller{/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug, $categoria){$entity = $this->getRepository(TtsDemoBundle:Prodotto)->findOneBy(array(“codice” => $codice));return $this->render(TtsDemoBundle:Prodotto:show_offer.html.twig, array(entity => $entity));}$this->render()
  54. 54. http://traintosymfony.com54Emanuele Gasparicostruire una Responseè possibile anche costruire un oggetto Responseutile nel caso in cui abbia necessità di costruire la rispostain più passaggi a seconda di variabilio di effettuare delle operazioni successivamente
  55. 55. http://traintosymfony.com55Emanuele Gasparicostruire una Responseutilizzo la funzione $this->renderView() per memorizzareun contenuto HTML in una variabilecreo un oggetto Response con quella variabile come primoargomentoimpostando
  56. 56. http://traintosymfony.com56Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyComponentHttpFoundationResponse;class ProdottoController extends Controller{/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug, $categoria){$entity = [...]$content = $this->renderView(TtsDemoBundle:Prodotto:show.html.twig, array(entity => $entity));[...]return new Response($content);}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyComponentHttpFoundationResponse;class ProdottoController extends Controller{/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug, $categoria){$entity = [...]$content = $this->renderView(TtsDemoBundle:Prodotto:show.html.twig, array(entity => $entity));[...]return new Response($content);}
  57. 57. http://traintosymfony.com57Emanuele Gaspari# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyComponentHttpFoundationResponse;class ProdottoController extends Controller{/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug, $categoria){$entity = [...]$response = new Response($entity->getCodice(), 200, array(content-type => text/html));$response->prepare($this->getRequest());$response->send();}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyComponentHttpFoundationResponse;class ProdottoController extends Controller{/*** @Route("/prodotto/{categoria}/{codice}/{slug}", name=”prodotto_show”)*/public function showAction($codice, $slug, $categoria){$entity = [...]$response = new Response($entity->getCodice(), 200, array(content-type => text/html));$response->prepare($this->getRequest());$response->send();}
  58. 58. http://traintosymfony.com58Emanuele Gasparijsonanche restituire una risposta in formato json è semplice
  59. 59. http://traintosymfony.com59Emanuele Gasparijson Response# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyComponentHttpFoundationResponse;use SymfonyComponentHttpFoundationJsonResponse;public function jsonAction($codice, $slug, $categoria){$entity = [...]$jsonResponse = array(“codice” => $entity->getCodice(), [...]);// crea una risposta JSON$response = new Response(json_encode($jsonResponse));$response->headers->set(Content-Type, application/json);return $response;// crea una risposta JSON utilizzando la classe JsonResponse (Symfony >= 2.1)$response = new JsonResponse();$response->setData($jsonResponse);return $response;}# src/Tts/DemoBundle/Controller/ProdottoController.php<?phpuse SymfonyComponentHttpFoundationResponse;use SymfonyComponentHttpFoundationJsonResponse;public function jsonAction($codice, $slug, $categoria){$entity = [...]$jsonResponse = array(“codice” => $entity->getCodice(), [...]);// crea una risposta JSON$response = new Response(json_encode($jsonResponse));$response->headers->set(Content-Type, application/json);return $response;// crea una risposta JSON utilizzando la classe JsonResponse (Symfony >= 2.1)$response = new JsonResponse();$response->setData($jsonResponse);return $response;}
  60. 60. http://traintosymfony.com60Emanuele Gaspaririassunto●un array●$this->render()●$this->renderView()●un oggetto Response●un oggetto JsonResponseabbiamo visto che unazione può utilizzare:...e può fare molto altro!
  61. 61. http://traintosymfony.com61Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  62. 62. http://traintosymfony.com62Emanuele Gaspariredirectil redirect è un messaggio al browsercambia lurl perché è effettivamente una nuova richiestain caso di:●redirect temporaneo (302, default) o permanente (301)●invio corretto di un form: redirezione ad una pagina di conferma●se il sito è multilingua, si può effettuare un redirect dopo aver scelto la linguain base al browser
  63. 63. http://traintosymfony.com63Emanuele Gaspariredirect temporaneo# src/Tts/DemoBundle/Controller/DefaultController.php<?phpclass DefaultController extends Controller{/*** @Route("/", name=”homepage”)*/public function homepageAction(){return $this->redirect($this->generateUrl(homepage_natale));}}# src/Tts/DemoBundle/Controller/DefaultController.php<?phpclass DefaultController extends Controller{/*** @Route("/", name=”homepage”)*/public function homepageAction(){return $this->redirect($this->generateUrl(homepage_natale));}}redirect temporaneo ad un altro url
  64. 64. http://traintosymfony.com64Emanuele GaspariRedirectResponsecè un oggetto dedicato (che sorpresa!) che la Action puòrestituire in caso di redirect: RedirectResponse
  65. 65. http://traintosymfony.com65Emanuele GaspariRedirectResponse# src/Tts/DemoBundle/Controller/DefaultController.php<?phpuse SymfonyComponentHttpFoundationRedirectResponseclass DefaultController extends Controller{/*** @Route(“/”, name=”homepage”)*/public function homepageAction(){$respose = new RedirectResponse($this->generateUrl(homepage_natale));[..]return $response;}}# src/Tts/DemoBundle/Controller/DefaultController.php<?phpuse SymfonyComponentHttpFoundationRedirectResponseclass DefaultController extends Controller{/*** @Route(“/”, name=”homepage”)*/public function homepageAction(){$respose = new RedirectResponse($this->generateUrl(homepage_natale));[..]return $response;}}
  66. 66. http://traintosymfony.com66Emanuele Gaspari# src/Tts/DemoBundle/Controller/DefaultController.php<?phpclass DefaultController extends Controller{/*** @Route("/chisiamo", name=”chisiamo”)*/public function chisiamoAction(){return $this->redirect($this->generateUrl(homepage_contatti), 301);}}# src/Tts/DemoBundle/Controller/DefaultController.php<?phpclass DefaultController extends Controller{/*** @Route("/chisiamo", name=”chisiamo”)*/public function chisiamoAction(){return $this->redirect($this->generateUrl(homepage_contatti), 301);}}redirect permanenteredirect permanente con codice di stato HTTP 301
  67. 67. http://traintosymfony.com67Emanuele GaspariRoutesController e Actionspecificare una RouteRoutes parametricheannotation @Routecollisione di urlsController Naming PatternRequestoggetto Requesti parametriResponseoggetto Responseredirectparametri per il templateROUTING
  68. 68. http://traintosymfony.com68Emanuele Gasparilazione può passare delle variabili al template restituendo un arraypublic function showAction($codice){[...]return array(entity => $entity,show_extended_version => true);}public function showAction($codice){[...]return array(entity => $entity,show_extended_version => true);}utilizzabili nel template twig{% if show_extended_version %}[...]{% else %}<a href=”...”>{{ entity.codice }}</a>{% endif %}{% if show_extended_version %}[...]{% else %}<a href=”...”>{{ entity.codice }}</a>{% endif %}
  69. 69. TRAINTO SYMFONYVerona, 13•14 Aprile 2013the frameworkshophttp://traintosymfony.com@TrainToSymfonyMedia partner:©Copyright Emanuele Gaspari Castelletti

×