e coesi utili per la risoluzione di problemi comuni. Symfony2 è anche un framework completo # indipendenti da altri componenti (modificando A non rompo B)
utili per la risoluzione di problemi comuni. Symfony2 è anche un framework completo # singola responsabilità (quindi un unico motivo per essere modificati) Cos'e ?
parte del model. Possiamo decidere se implementarla con un ORM (Doctrine), o in qualsiasi altro modo Garantisce la separazione della logica dalla presentazione Cos'e ?
..) • Sta diventando la base di molti progetti Open Source (silex, phpunit, behat, assetic, doctrine, propel, phpBB, Drupal8, ezPublish) • Tutto questo utilizzo inevitabilmente migliora l'interoperabilità tra questi progetti (ci si avvicina ad uno standard) • Vasta comunità ( > 1600 bundles sviluppati solo nell'ultimo anno) Perchè ?
in continuo aggiornamento • Abbraccia la filosofia "don't reinvent the wheel" fornendo una stretta integrazione con molti progetti open source • Abbraccia a pieno PHP 5.3 • Dependency Injection • Twig Template engine (che verrà utilizzato da Drupal ed ezPublish) • Built-in web profiler e console Perchè ?
Rappresentano un modo di creare insiemi di classi, interfacce, funzioni e costanti legate tra loro dal comune obiettivo di risolvere un problema Namespace
creazione di classi e codice riutilizzabile: 1. collisione dei nomi tra le classi (due classi con lo stesso nome nello stesso progetto) 2. possibilità di creare alias (PugMarche\Round1\Esempi\PrimoEsempi o as Es1), per accorciare i nomi delle classi e migliolare la leggibilità del codice Namespace
autoloading, il codice diventa indipendente da dove sono definiti i suoi elementi all'interno del filesystem PRS-0 definisce lo standard di utilizzo per i namespace Autoloading (PSR-0)
includere tutti i file src/ e vendor/ Non si avrà mai bisogno di includere file "a mano". Symfony2 utilizza i namespace e la convezione psr-0 per auto-includere tutti i file che serviranno Nome della classe: PugMarche\Round1\HelloBundle\Controller\HelloController Percorso: src/PugMarche/Round1/HelloBundle/Controller/HelloController.php Autoloading (PSR-0)
"$string $name"; }; $closure("Riccardo"); Prima : $hello = create_function('$name, $string', 'echo "$string $name"' ); Rispetto ad una funziona anonima, la closure può accedere a variabili definite al di fuori della closure stessa Closure
dietro l'ambiente che ha intorno al punto dove viene definita (ovvero può referenziare variabili/oggetti che ha intorno e modificarli - quindi è in grado di modifcare lo stato di tali oggetti) Closure
dipendenze (vendors) ed eventualmente anche per l'installazione. Dalla versione 2.1 viene utilizzato anche l'autoloader di composer. http://symfony.com/download http://symfony.com/doc/current/book/installation.html http://getcomposer.org/ Installazione e config.
public function registerBundles() { $bundles = array( // ... new PugMarche\Round1\HelloBundle\PugMarcheHelloBundle(), ); // ... return $bundles; } Creazione di una pagina - #1
class HelloController { public function indexAction($name) { return new Response('<html><body>Ciao '.$name.'!</body></html>'); } } Ha il compito di elaborare la richiesta che arriva e restituire una risposta. Il controllore deve sempre tornare un oggetto Response. Creazione di una pagina - #2
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class HelloController { /** * @Route("/hello/{name}", name="hello_action") */ public function indexAction($name) { return new Response('<html><body>Ciao '.$name.'!</body></html>'); } } Creazione di una pagina - #2 possiamo accedere all'oggetto Request
annotation prefix: / Definire una rotta significa semplicemente definire un mapping tra un URL della nostra applicazione con una action nel controllore (ovvero con un metodo) Creazione di una pagina - #2
PHP con codice ottimizzato. L'overhead di compilazione è minimo. La classe viene eseguita a runtime (app/cache/{env}/twig) FACILE Pensato per essere facile da leggere anche da parte dei grafici (semplice da imparare) TWIG
ogni output; lo sviluppatore può definire una sandbox per i template dove l'utente ha un accesso limitato ai tags, filtri, oggetti e funzioni FLESSIBILE Possibilità di creare tags, filtri, funzioni, operatori. Ereditarietà tra i template TWIG
Symfony\Component\HttpFoundation\Response; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class HelloController extends Controller { /** * @Route("/hello/{name}") */ public function indexAction($name) { return $this->render('AcmeHelloBundle:Hello:index.html.twig', array('name' => $name)); } } Creazione di una pagina - #2
in un file separato e di poterlo riutilizzare (o riutilizzare porzioni) per diverse pagine render() restituisce un oggetto Response popolato con il contenuto del template dato. Per utilizzare render() il controllore deve estendere la classe Controller, che aggiunge degli helper (come render) alla nostra classe NomeBundle:NomeControllore:NomeTemplate /percorso/di/NomeBundle/Resources/views/NomeControllore/NomeTemplate Creazione di una pagina - #2
php della nostra applicazione vendor : librerie dei venditori web : cartella accessibile pubblicamente (contiene i frontcontroller che eseguono il bootstrap e inviano la richiesta al kernel; assets) Struttura cartelle