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
5. http://traintosymfony.com5
Emanuele Gaspari
un po' di storia
S 1.0 → gennaio 2007
S 1.2 → novembre 2008
S 1.4 → novembre 2009
S 2.0 → luglio 2011
S 2.1 → settembre 2012
S 2.2 → marzo 2013
S 2.3 → maggio 2013 (LTS)
Symfonyis a trademark of Fabien Potencier. All rights reserved.
6. http://traintosymfony.com6
Emanuele Gaspari
def.
Symfony2 è un insieme di componenti PHP riutilizzabili e indipendenti
che 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.
8. http://traintosymfony.com8
Emanuele Gaspari
Symfony fornisce degli (ottimi) strumenti
per 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
11. http://traintosymfony.com11
Emanuele Gaspari
framework, #Symfony
perché un framework
●
codice coperto da test
(security audit 2011, 9.500 euro
per 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
14. http://traintosymfony.com14
Emanuele Gaspari
in Symfony ogni cosa è un bundle
funzionalità del core
codice di terze parti
codice 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
15. http://traintosymfony.com15
Emanuele Gaspari
un bundle è una cartella
che contiene codice PHP
può ospitare qualsiasi cosa
●
controllers
●
templates
●
assets javascript, css, immagini
●
classi varie
●
...
ha una struttura ben definita,
che all'occorrenza può essere
personalizzata
(vedi KnpRadBundle, http://rad.knplabs.com)
https://github.com/inmarelibero/SymfonyBricks
organizzazione di un bundle
16. 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
20. http://traintosymfony.com20
Emanuele Gaspari
PHP 5.3
S 2.0 >= 5.3.2
S 2.1 >= 5.3.3
S 2.2 >= 5.3.3
PHP 5.3.0 è stato rilasciato nel giugno 2009
namespaces
funzioni lambda/closures
garbage collection
Symfony2 richiede come minimo
la versione 5.3.2 di PHP
21. http://traintosymfony.com21
Emanuele Gaspari
# /var/www/vhosts/traintosymfony/src/Foo/BarBundle/Controller/DefaultController.php
<?php
namespace 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
<?php
namespace FooBarBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationResponse;
class DefaultController extends Controller
{
public function indexAction()
{
return new Response("Hello");
}
}
PSR-0
https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
namespaces
/var/www/vhosts/traintosymfony/src/Foonamespace Foo
27. http://traintosymfony.com27
Emanuele Gaspari
front 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
29. http://traintosymfony.com29
Emanuele Gaspari
flusso di un'applicazione Symfony 1/3
il client invia una richiesta che viene ricevuta dal Front Controller (app.php)
il front controller crea e gestisce un oggetto di tipo Request
31. http://traintosymfony.com31
Emanuele Gaspari
flusso di un'applicazione Symfony 3/3
viene eseguita un'azione, che restituisce una risposta al client (html, xml, json)
le azioni restituiscono SEMPRE un oggetto di tipo Response
35. http://traintosymfony.com35
Emanuele Gaspari
facciamo 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
37. http://traintosymfony.com37
Emanuele Gaspari
HTTP
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
39. http://traintosymfony.com39
Emanuele Gaspari
HTTP
richiesta
risposta
client 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
43. http://traintosymfony.com43
Emanuele Gaspari
la filosofia
“Symfony è progettato per soddisfare questa realtà.”
"Se Symfony non offrisse altro, avresti comunque un kit di strumenti
per un facile accesso alle informazioni di richiesta
e un'interfaccia object-oriented per la creazione della risposta.
[...] l'obiettivo della tua applicazione è sempre quello di
interpretare una richiesta e creare la risposta appropriata in base alla logica
dell'applicazione."
http://symfony.com/doc/current/book/http_fundamentals.html
44. 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
46. 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
47. 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
48. 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
50. http://traintosymfony.com50
Emanuele Gaspari
vorrei mostrare agli utenti dei clean urls (il più possibile)
posizionamento sui motori di ricerca
univocità dell'indirizzo web
gli url “parlanti” migliorano la comunicazione
/prodotto?codice=EG-124 /prodotto/EG-124
clean urls
52. http://traintosymfony.com52
Emanuele Gaspari
gestire 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 segnaposto
vorrei che gli url fossero “generati”
debug
54. 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 tra
un 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
59. http://traintosymfony.com59
Emanuele Gaspari
esempio
<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à
62. http://traintosymfony.com62
Emanuele Gaspari
risposta 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
63. http://traintosymfony.com63
Emanuele Gaspari
template 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 testo
contenente tag HTML e blocchi di sintassi TWIG