symfony (1/3) | train to symfony

64
http://traintosymfony.com 1 Emanuele Gaspari TRAIN TO SYMFONY Verona, 13•14 Aprile 2013 the frameworkshop http://traintosymfony.com @TrainToSymfony Media partner: Symfony (1/3)

Upload: inmarelibero

Post on 14-Jun-2015

1.531 views

Category:

Documents


7 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Symfony (1/3) | Train to Symfony

http://traintosymfony.com1 Emanuele Gaspari

TRAINTO SYMFONY

Verona, 13•14 Aprile 2013

the frameworkshop

http://traintosymfony.com@TrainToSymfony

Media partner:

Symfony (1/3)

Page 2: Symfony (1/3) | Train to Symfony

http://traintosymfony.com2 Emanuele Gaspariabout me

creatore di SymfonyBricks

Emanuele Gaspari

ultimo 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/MetaTagsBundle

https://symfonybricks.com

[email protected] @inmarelibero

Page 3: Symfony (1/3) | Train to Symfony

http://traintosymfony.com3 Emanuele Gaspari

prima parte:

familiarità con i concetti di Symfony

Symfony: teoria e codice

Routing Templatingoverview

Page 4: Symfony (1/3) | Train to Symfony

http://traintosymfony.com4 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 5: Symfony (1/3) | Train to Symfony

http://traintosymfony.com5 Emanuele Gaspariun po' di storia

S 1.0 → gennaio 2007S 1.2 → novembre 2008S 1.4 → novembre 2009

S 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.

Page 6: Symfony (1/3) | Train to Symfony

http://traintosymfony.com6 Emanuele Gasparidef.

Symfony2 è un insieme di componenti PHP riutilizzabili e indipendentiche risolvono problemi frequenti di sviluppo.

Symfony Standard Distribution

http://fabien.potencier.org/article/49/what-is-symfony2, 25 Ottobre 2011 http://symfony.com/it/doc/current/book/http_fundamentals.html

Sulla base di questi componenti, Symfony2 è anche un framework completo.

Page 7: Symfony (1/3) | Train to Symfony

http://traintosymfony.com7 Emanuele Gasparigli attrezzi

Symfony è una cassetta degli attrezzi

Page 8: Symfony (1/3) | Train to Symfony

http://traintosymfony.com8 Emanuele Gaspari

Symfony fornisce degli (ottimi) strumentiper gestire (molti) problemi ricorrenti

persistenza dei dati sicurezza form

validazione templating configurazione

logging gestione degli assets routing

traduzioni serializzazione console tasks

caching invio di email etc...

problemi ricorrenti

Page 9: Symfony (1/3) | Train to Symfony

http://traintosymfony.com9 Emanuele Gaspari

a noi resta solo il divertimento

yeah!

Page 10: Symfony (1/3) | Train to Symfony

http://traintosymfony.com10 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 11: Symfony (1/3) | Train to Symfony

http://traintosymfony.com11 Emanuele Gaspariframework, #Symfony

perché 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

Page 12: Symfony (1/3) | Train to Symfony

http://traintosymfony.com12 Emanuele Gaspari

non occuparsi di task ripetitivi

offrire strumenti opzionaliper risolvere

problemi complessi

goals

Page 13: Symfony (1/3) | Train to Symfony

http://traintosymfony.com13 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 14: Symfony (1/3) | Train to Symfony

http://traintosymfony.com14 Emanuele Gaspari

in Symfony ogni cosa è un bundle

funzionalità del corecodice di terze particodice dell'applicazione

“In Symfony2, bundles are first-class citizens that are so flexible that even core code itself is a bundle.”

http://symfony.com/doc/master/cookbook/symfony1.html

everything is a bundle

Page 15: Symfony (1/3) | Train to Symfony

http://traintosymfony.com15 Emanuele Gaspari

un bundle è una cartellache contiene codice PHP

può ospitare qualsiasi cosa● controllers● templates● assets javascript, css, immagini● classi varie● ...

ha una struttura ben definita,che all'occorrenza può esserepersonalizzata

(vedi KnpRadBundle, http://rad.knplabs.com)

https://github.com/inmarelibero/SymfonyBricks

organizzazione di un bundle

Page 16: Symfony (1/3) | Train to Symfony

http://traintosymfony.com16 Emanuele Gaspari

il core di Symfony e tutti i bundles aggiunti successivamente vengono gestiti attraverso

Composer

$ php composer.phar install$ php composer.phar install

$ php composer.phar update$ php composer.phar update

il file vendor/autoload.php carica in Symfony tutte le librerie installate

http://getcomposer.org

e installati nella cartella /vendor

vendor

Page 17: Symfony (1/3) | Train to Symfony

http://traintosymfony.com17 Emanuele Gasparicore

componenti librerie esterne bundles

ConfigConsoleFormHttpFoundationHttpKernelLocaleRoutingSecurityTemplatingTranslationValidatorYaml

Doctrine ORMSwiftMailerTwig

SensioFrameworkExtraBundleSensioGeneratorBundleJMSSecurityExtraBundleDoctrineFixturesBundleDoctrineMigrationsBundleDoctrineMongoDBBundle

il core di Symfony (elenco ampiamente parziale)

Page 18: Symfony (1/3) | Train to Symfony

http://traintosymfony.com18 Emanuele Gaspari

configurazione

componenti di Symfonylibrerie di terze partiorganizzato in bundles

bundles dell'utente

document root dell'applicazione

controllers

templates, javascript, css

front controllers

struttura di un'applicazione

Page 19: Symfony (1/3) | Train to Symfony

http://traintosymfony.com19 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 20: Symfony (1/3) | Train to Symfony

http://traintosymfony.com20 Emanuele GaspariPHP 5.3

S 2.0 >= 5.3.2S 2.1 >= 5.3.3S 2.2 >= 5.3.3

PHP 5.3.0 è stato rilasciato nel giugno 2009

namespacesfunzioni lambda/closuresgarbage collection

Symfony2 richiede come minimola versione 5.3.2 di PHP

Page 21: Symfony (1/3) | Train to Symfony

http://traintosymfony.com21 Emanuele Gaspari

# /var/www/vhosts/traintosymfony/src/Foo/BarBundle/Controller/DefaultController.php

<?phpnamespace Foo\BarBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Symfony\Component\HttpFoundation\Response;

class DefaultController extends Controller{ public function indexAction()

{ return new Response("Hello"); }}

# /var/www/vhosts/traintosymfony/src/Foo/BarBundle/Controller/DefaultController.php

<?phpnamespace Foo\BarBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Symfony\Component\HttpFoundation\Response;

class DefaultController extends Controller{ public function indexAction()

{ return new Response("Hello"); }}

PSR-0https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md

namespaces

/var/www/vhosts/traintosymfony/src/Foonamespace Foo

Page 22: Symfony (1/3) | Train to Symfony

http://traintosymfony.com22 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 23: Symfony (1/3) | Train to Symfony

http://traintosymfony.com23 Emanuele Gaspariil nostro lavoro

il nostro lavoro è quello di sviluppare

applicazioni web

che gestiscano

richieste HTTP

e producano una

risposta

Page 24: Symfony (1/3) | Train to Symfony

http://traintosymfony.com24 Emanuele Gaspari

Page 25: Symfony (1/3) | Train to Symfony

http://traintosymfony.com25 Emanuele Gasparihelp

Symfony ti aiuta esattamente a fare questo

Page 26: Symfony (1/3) | Train to Symfony

http://traintosymfony.com26 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 27: Symfony (1/3) | Train to Symfony

http://traintosymfony.com27 Emanuele Gasparifront controller

il front controller è l'unico punto di accesso all'applicazione dall'esterno

si occupa di fare il bootstrap dell'applicazione (kernel),interrogare il controller e restituire una risposta

/app.php /app_dev.php

Page 28: Symfony (1/3) | Train to Symfony

http://traintosymfony.com28 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 29: Symfony (1/3) | Train to Symfony

http://traintosymfony.com29 Emanuele Gaspariflusso di un'applicazione Symfony 1/3

Ogni richiesta del client esegue il front controller

il client invia una richiesta che viene ricevuta dal Front Controller (app.php)

il front controller crea e gestisce un oggetto di tipo Request

Page 30: Symfony (1/3) | Train to Symfony

http://traintosymfony.com30 Emanuele Gaspariflusso di un'applicazione Symfony 2/3

il front controller interroga il sistema di routingvengono chiamati il controller a la action corretti in base all'url

attraverso il sistema di Routing, Symfony individuaun Controller e una Action da eseguire a seconda dell'url

Page 31: Symfony (1/3) | Train to Symfony

http://traintosymfony.com31 Emanuele Gaspariflusso di un'applicazione Symfony 3/3

l'azione produce un output e lo restituisce al client

viene eseguita un'azione, che restituisce una risposta al client (html, xml, json)

le azioni restituiscono SEMPRE un oggetto di tipo Response

Page 32: Symfony (1/3) | Train to Symfony

http://traintosymfony.com32 Emanuele Gaspariflusso completo

richiestabootstrap (del kernel)dell'applicazioneSymfony

Front Controller(app.php)

Controller risposta

browser browser

Page 33: Symfony (1/3) | Train to Symfony

http://traintosymfony.com33 Emanuele Gaspari

# /var/www/vhosts/traintosymfony/web/app.php

<?phpuse Symfony\Component\HttpFoundation\Request;

$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 Symfony\Component\HttpFoundation\Request;

$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

Page 34: Symfony (1/3) | Train to Symfony

http://traintosymfony.com34 Emanuele Gaspari

Page 35: Symfony (1/3) | Train to Symfony

http://traintosymfony.com35 Emanuele Gasparifacciamo il punto

creare una Route che associ un url ad un'azione contenuta in un Controller

fare in modo che l'azione restituisca una risposta, tipicamente dopo aver eseguito delle operazioni

se la risposta è html, stampare un template TWIG

Page 36: Symfony (1/3) | Train to Symfony

http://traintosymfony.com36 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 37: Symfony (1/3) | Train to Symfony

http://traintosymfony.com37 Emanuele GaspariHTTP

HTTP

non importa con quali strumenti e in che modo sviluppi per il web,

l'obiettivo è SEMPRE

di interpretare una richiesta e fornire una risposta

linguaggio testuale che permette a due macchine di comunicare

1.1 RFC 2616/1999

Page 38: Symfony (1/3) | Train to Symfony

http://traintosymfony.com38 Emanuele Gaspari

lo schema seguente rappresenta tutta la complessità di una richiesta HTTP 1.1

presta molta attenzione

ATTENZIONE!

warning

Page 39: Symfony (1/3) | Train to Symfony

http://traintosymfony.com39 Emanuele GaspariHTTP

richiesta

rispostaclient SERVER

The 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. The server responds with a status line, including the message's protocol version and a success or error code, followed by a MIME-like message containing server information, entity metainformation, and possible entity-body content.http://tools.ietf.org/html/rfc2068

Page 40: Symfony (1/3) | Train to Symfony

http://traintosymfony.com40 Emanuele Gaspariok, lo sapevo

grazie, lo sapevo già(o forse no)

Page 41: Symfony (1/3) | Train to Symfony

http://traintosymfony.com41 Emanuele Gaspari

body

una richiesta HTTP

Protocollo http

http://www.symfony.comhttp://www.symfony.com

Page 42: Symfony (1/3) | Train to Symfony

http://traintosymfony.com42 Emanuele Gaspariobiettivi

HTTP è uno standard e funziona molto bene

è importante ricordarsi da dove si parte e cosa si vuole ottenere

L'adesione allo standard HTTP è un obiettivo di Symfony2

Page 43: Symfony (1/3) | Train to Symfony

http://traintosymfony.com43 Emanuele 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 richiesta

e un'interfaccia object-oriented per la creazione della risposta.

[...] l'obiettivo della tua applicazione è sempre quello diinterpretare una richiesta e creare la risposta appropriata in base alla logica

dell'applicazione."

http://symfony.com/doc/current/book/http_fundamentals.html

Page 44: Symfony (1/3) | Train to Symfony

http://traintosymfony.com44 Emanuele Gaspari

finora non ho avuto (particolari) problemi con$_GET, $_SERVER, etc..

perché dovrei usare Symfony per la gestione di ogni richiesta?

Request Response

Symfony modella la richiesta e la risposta HTTP con le due classi PHP

gestire le richieste

Page 45: Symfony (1/3) | Train to Symfony

http://traintosymfony.com45 Emanuele Gaspari

un solo esempio può essere sufficiente

Page 46: Symfony (1/3) | Train to Symfony

http://traintosymfony.com46 Emanuele Gaspari

string(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_LANGUAGE

http://php.net/manual/en/reserved.variables.server.php

Page 47: Symfony (1/3) | Train to Symfony

http://traintosymfony.com47 Emanuele Gaspari

array(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

Page 48: Symfony (1/3) | Train to Symfony

http://traintosymfony.com48 Emanuele Gaspari

non re-inventare la ruota

non occuparsi di task ripetitivi

ABOUT: “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 extraordinary feat has been accomplished, similar to the Fuck Yeah illustration.

Freddie Mercury Rage Pose

Page 49: Symfony (1/3) | Train to Symfony

http://traintosymfony.com49 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 50: Symfony (1/3) | Train to Symfony

http://traintosymfony.com50 Emanuele Gaspari

vorrei mostrare agli utenti dei clean urls (il più possibile)

posizionamento sui motori di ricercaunivocità dell'indirizzo webgli url “parlanti” migliorano la comunicazione

/prodotto?codice=EG-124 /prodotto/EG-124

clean urls

Page 51: Symfony (1/3) | Train to Symfony

http://traintosymfony.com51 Emanuele Gaspari

Wordpress dà la possibilità di scegliere il formato dell'url di un post:

wordpress

Page 52: Symfony (1/3) | Train to Symfony

http://traintosymfony.com52 Emanuele Gasparigestire gli url

Come 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

Page 53: Symfony (1/3) | Train to Symfony

http://traintosymfony.com53 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 54: Symfony (1/3) | Train to Symfony

http://traintosymfony.com54 Emanuele Gaspari

# app/config/routing.yml

prodotto_show: path: /prodotto/{codice} defaults: { _controller: TtsDemoBundle:Prodotto:show}

# app/config/routing.yml

prodotto_show: path: /prodotto/{codice} defaults: { _controller: TtsDemoBundle:Prodotto:show}

in Symfony una Route è un'associazione traun url e un Controller, tramite il parametro path

class 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-01

Route

Urls Controller

Routes

Page 55: Symfony (1/3) | Train to Symfony

http://traintosymfony.com55 Emanuele Gaspari

prodotto_show:

path: /prodotto/{codice}

defaults: { _controller: TtsDemoBundle:Prodotto:show}

Route name

path

Controller e Action (nome logico)

una Route

Page 56: Symfony (1/3) | Train to Symfony

http://traintosymfony.com56 Emanuele Gaspari

GET /prodotto/EG-124GET /prodotto/EG-27GET /prodotto/EG-74

GET /prodotto/EG-124GET /prodotto/EG-27GET /prodotto/EG-74

alcuni esempi di Routes

GET /GET /

GET /catalogoGET /catalogo

prodotto_show: path: /prodotto/{codice} defaults: [...]

prodotto_show: path: /prodotto/{codice} defaults: [...]

catalogo_index: path: /catalogo defaults: [...]

catalogo_index: path: /catalogo defaults: [...]

homepage:path: /

defaults: [...]

homepage:path: /

defaults: [...]

url e path

Page 57: Symfony (1/3) | Train to Symfony

http://traintosymfony.com57 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 58: Symfony (1/3) | Train to Symfony

http://traintosymfony.com58 Emanuele GaspariTWIG

Symfony usa TWIG come linguaggio e motore di templating pergenerare contenuto HTML

TWIG permette di scrivere templates concisi e leggibili, sia da sviluppatori che da web designers

offre anche funzionalità avanzate utilizzabili in modo semplice

The Twig logo is © 2010-2012 Sensio Labs

Page 59: Symfony (1/3) | Train to Symfony

http://traintosymfony.com59 Emanuele 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à

Page 60: Symfony (1/3) | Train to Symfony

http://traintosymfony.com60 Emanuele Gaspari

intro

Symfony2: what?

usare un framework

Symfony internals

namespaces

Request e Response

Front Controller

flusso di un'applicazione

HTTP

Routing

clean urls

Routes in Symfony

Templating

TWIG

risposta HTML

OVERVIEW

Page 61: Symfony (1/3) | Train to Symfony

http://traintosymfony.com61 Emanuele Gasparirisposta HTML

Lo step successivo è quello di ritornare una risposta al client

nella terza fase del flusso request/response l'azione produce una risposta

Page 62: Symfony (1/3) | Train to Symfony

http://traintosymfony.com62 Emanuele Gasparirisposta HTML

● gestito la richiesta che arriva all'applicazione● analizzato i parametri di ingresso (GET, POST, SESSION, etc..)● utilizzato le risorse necessarie● eseguito delle operazioni● preparato i dati per la risposta

dopo che l'azione ha:

...il passaggio successivo è preparare il contenuto HTML per il client

Page 63: Symfony (1/3) | Train to Symfony

http://traintosymfony.com63 Emanuele Gasparitemplate twig

viene convertito (quasi sempre) in HTML per produrre il body della risposta da restituire al client

● l'azione “sceglie” un template● si passano (opzionalmente) delle variabili al template● TWIG effettua il parsing, generando HTML● la risposta viene inviata al client

in Symfony un template è semplicemente un file di testocontenente tag HTML e blocchi di sintassi TWIG

Page 64: Symfony (1/3) | Train to Symfony

TRAINTO SYMFONY

Verona, 13•14 Aprile 2013

the frameworkshop

http://traintosymfony.com@TrainToSymfony

Media partner:©Copyright Emanuele Gaspari Castelletti