Symfony (1/3) | Train to Symfony

Post on 14-Jun-2015

1.535 views 7 download

Tags:

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 of 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

inmarelibero@gmail.com @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