Download - 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)
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
http://traintosymfony.com3 Emanuele Gaspari
prima parte:
familiarità con i concetti di Symfony
Symfony: teoria e codice
Routing Templatingoverview
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
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.
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.
http://traintosymfony.com7 Emanuele Gasparigli attrezzi
Symfony è una cassetta degli attrezzi
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
http://traintosymfony.com9 Emanuele Gaspari
a noi resta solo il divertimento
yeah!
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
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
http://traintosymfony.com12 Emanuele Gaspari
non occuparsi di task ripetitivi
offrire strumenti opzionaliper risolvere
problemi complessi
goals
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
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
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
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
http://traintosymfony.com17 Emanuele Gasparicore
componenti librerie esterne bundles
ConfigConsoleFormHttpFoundationHttpKernelLocaleRoutingSecurityTemplatingTranslationValidatorYaml
Doctrine ORMSwiftMailerTwig
SensioFrameworkExtraBundleSensioGeneratorBundleJMSSecurityExtraBundleDoctrineFixturesBundleDoctrineMigrationsBundleDoctrineMongoDBBundle
il core di Symfony (elenco ampiamente parziale)
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
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
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
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
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
http://traintosymfony.com23 Emanuele Gaspariil nostro lavoro
il nostro lavoro è quello di sviluppare
applicazioni web
che gestiscano
richieste HTTP
e producano una
risposta
http://traintosymfony.com24 Emanuele Gaspari
http://traintosymfony.com25 Emanuele Gasparihelp
Symfony ti aiuta esattamente a fare questo
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
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
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
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
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
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
http://traintosymfony.com32 Emanuele Gaspariflusso completo
richiestabootstrap (del kernel)dell'applicazioneSymfony
Front Controller(app.php)
Controller risposta
browser browser
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
http://traintosymfony.com34 Emanuele Gaspari
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
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
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
http://traintosymfony.com38 Emanuele Gaspari
lo schema seguente rappresenta tutta la complessità di una richiesta HTTP 1.1
presta molta attenzione
ATTENZIONE!
warning
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
http://traintosymfony.com40 Emanuele Gaspariok, lo sapevo
grazie, lo sapevo già(o forse no)
http://traintosymfony.com41 Emanuele Gaspari
body
una richiesta HTTP
Protocollo http
http://www.symfony.comhttp://www.symfony.com
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
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
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
http://traintosymfony.com45 Emanuele Gaspari
un solo esempio può essere sufficiente
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
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
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
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
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
http://traintosymfony.com51 Emanuele Gaspari
Wordpress dà la possibilità di scegliere il formato dell'url di un post:
wordpress
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
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
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
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
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
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
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
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à
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
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
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
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
TRAINTO SYMFONY
Verona, 13•14 Aprile 2013
the frameworkshop
http://traintosymfony.com@TrainToSymfony
Media partner:©Copyright Emanuele Gaspari Castelletti