Symfony2


Paul Seiffert I 03.03.2011




                             © Mayflower GmbH 2010
Eckdaten

Ausgewachsenes PHP-Framework

Komplette Neuentwicklung

~ 755 PHP-Klassen in 975 .php-Dateien


                                   Mayflower GmbH I 2
Architektur und Internals




12.03.11                          Mayflower GmbH                                                   3


                        Bild: http://www.flickr.com/photos/army_arch/3343321507/sizes/z/in/photostream/
Architektur (I)



I Basis: Überschaubarer Microkernel (Symfony Components)
I „Everything else is a bundle“




              MVC        Doctrine      Twig   Security



                                  Kernel



                                                           Mayflower GmbH I 4
Architektur (II)



Application                                           Third-Party
   Bundles      Shop    Blog                User      Bundles




                 MVC   Doctrine     Twig   Security



                               Kernel



                                                          Mayflower GmbH I 5
Architektur (III) – Der Kernel


Sammlung von Komponenten:
 I Abstraktion über PHP-Funktionen / System Calls

         Finder     Serializer       Process    Validator

 I Objekt-Orientierte Schnittstelle zu HTTP

        HttpFoundation      BrowserKit

 I Schlüsselfunktionalitäten im Zusammenspiel des Frameworks

         EventDispatcher         HttpKernel    DependencyInjection



                                                                     Mayflower GmbH I 6
Internals (I) – Der EventDispatcher


Ein „globales Observer-Pattern“:

                       connect('XY', array($this, 'callback'))
     Listener
                1) Please tell me if XY happens!


            3) Subject XYed with Z
                                                   EventDispatcher
                    callback($event)




                 2) Hey, I just XYed with Z!
     Subject               notify(new EventXY(Z))



                                                                     Mayflower GmbH I 7
Internals (II) – Der DependencyInjectionContainer



I Ziel: Keine konkreten Abhängigkeiten, d.h. keine direkte
  Instanziierung von Services mehr!

   $myDependency = new Services();
                              $container->getService();



          Zur Compile-Zeit:         Dependency-Graph

          Zur Laufzeit:             Service-Pool


                                                             Mayflower GmbH I 8
Beispiel-Konfiguration von Doctrine


 doctrine:
    dbal:
        dbname:   xxxxxxxx
        user:     xxxxxxxx
        password: ~
        logging: %kernel.debug%
    orm:
        auto_generate_proxy_classes: %kernel.debug%
        mappings:
            HelloBundle: ~




                                                  Mayflower GmbH I 9
Internals (III) – Der HttpKernel



I Aufgabe des HttpKernels:
  Transformation von Requests in Responses
I Zwei Abhängigkeiten: ControllerResolver und
  EventDispatcher

I Erweiterung des Transformationsprozesses mittels Event-Listener
  möglich


 Request

                            HTTP-Kernel
                                                             Response


                                                                Mayflower GmbH I 10
Praxis




12.03.11      Mayflower GmbH                                                 11


                   Bild: http://www.flickr.com/photos/reway2007/2927363741/lightbox/
Projektstruktur (I)




          Application-
     Configuration und
          Logs/Cache



        FrontController
        und Ressources



                Eigene
               Bundles


Third-Party Bundles
                          Mayflower GmbH I 12
Projektstruktur (II)




                       <?php

                       require_once __DIR__.'/../app/bootstrap_cache.php';
                       require_once __DIR__.'/../app/AppCache.php';

                       use SymfonyComponentHttpFoundationRequest;

                       $kernel = new AppKernel('prod', false);
                       $kernel­>handle(Request::createFromGlobals())­>send();




                                                                                Mayflower GmbH I 13
Projektstruktur (II)
                   <?php

                   use SymfonyComponentHttpKernelKernel;
                   use SymfonyComponentConfigLoaderLoaderInterface;

                   class AppKernel extends Kernel
                   {
                       public function registerBundles()
                       {
                           $bundles = array(
                               new SymfonyBundleFrameworkBundleFrameworkBundle(),
                               new SymfonyBundleTwigBundleTwigBundle(),
                               new SymfonyBundleZendBundleZendBundle(),
                               new SymfonyBundleDoctrineBundleDoctrineBundle(),

                               new PaulHelloBundleHelloBundle(),
                           );

                           if (in_array($this­>getEnvironment(), array('dev', 'test'))) {
                               $bundles[] = new SymfonyBundleWebProfilerBundleWebProfilerBundle();
                           }

                           return $bundles;
                       }

                       public function registerRootDir()
                       {
                           return __DIR__;
                       }

                       public function registerContainerConfiguration(LoaderInterface $loader)
                       {
                           $loader­>load(__DIR__.'/config/config_'.$this­>getEnvironment().'.yml');
                       }
                   }


                                                                                       Mayflower GmbH I 14
Projektstruktur (II)




                       <?php

                       namespace PaulHelloBundleController;

                       use SymfonyBundleFrameworkBundleControllerController;

                       class HelloController extends Controller
                       {
                           public function indexAction($name)
                           {
                               return $this­>render(
                                       'HelloBundle:Hello:index.html.twig',
                                       array('name' => $name));
                           }
                       }




                                                                              Mayflower GmbH I 15
Twig (Templating Engine)



I Sowohl als Standalone-Engine als auch als Bestandteil des
  Symfony-Frameworks verwendbar
 (http://www.twig-project.org/)

I First-Class citizens: Templates und Blöcke
   ·  Base-Template: „Layout“
   ·  Bundle-Templates erweitern das Layout
   ·  Action-Templates erweitern Bundle-Templates
   ·  …




                                                              Mayflower GmbH I 16
app/views/base.html.twig
Layout:     <!DOCTYPE html>
            <html>
                <head>
                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                    <title>{% block title %}Hello Application{% endblock %}</title>
                </head>
                <body>
                    {% block body %}{% endblock %}
                </body>
            </html>



Bundle-                        src/Paul/HelloBundle/Resources/views/layout.html.twig
            {% extends "::base.html.twig" %}
Template:   {% block body %}
                <h1>Hello Bundle</h1>

                {% block content %}{% endblock %}
            {% endblock %}



Action-                  src/Paul/HelloBundle/Resources/views/Hello/index.html.twig
            {% extends "HelloBundle::layout.html.twig" %}
Template:   {% block content %}
                Hello {{ name }}!<br /><br />

               <img src="{{ asset('images/katzenbank.png') }}" /><br />

                <a href="{{ path('hello', { 'name': 'Thomas' }) }}">Greet Thomas!
            </a>
            {% endblock %}


                                                                                    Mayflower GmbH I 17
?
    Mayflower GmbH I 18
Demo




       Mayflower GmbH I 19
Vielen Dank für Ihre Aufmerksamkeit!




      Kontakt   Paul Seiffert
                Paul.Seiffert@mayflower.de
                +49 89 242054 1172
                Mayflower GmbH
                Mannhardtstrasse 6
                80538 München


12.03.11                               Mayflower GmbH   20

Symfony2

  • 1.
    Symfony2 Paul Seiffert I03.03.2011 © Mayflower GmbH 2010
  • 2.
    Eckdaten Ausgewachsenes PHP-Framework Komplette Neuentwicklung ~755 PHP-Klassen in 975 .php-Dateien Mayflower GmbH I 2
  • 3.
    Architektur und Internals 12.03.11 Mayflower GmbH 3 Bild: http://www.flickr.com/photos/army_arch/3343321507/sizes/z/in/photostream/
  • 4.
    Architektur (I) I Basis:Überschaubarer Microkernel (Symfony Components) I „Everything else is a bundle“ MVC Doctrine Twig Security Kernel Mayflower GmbH I 4
  • 5.
    Architektur (II) Application Third-Party Bundles Shop Blog User Bundles MVC Doctrine Twig Security Kernel Mayflower GmbH I 5
  • 6.
    Architektur (III) –Der Kernel Sammlung von Komponenten: I Abstraktion über PHP-Funktionen / System Calls Finder Serializer Process Validator I Objekt-Orientierte Schnittstelle zu HTTP HttpFoundation BrowserKit I Schlüsselfunktionalitäten im Zusammenspiel des Frameworks EventDispatcher HttpKernel DependencyInjection Mayflower GmbH I 6
  • 7.
    Internals (I) –Der EventDispatcher Ein „globales Observer-Pattern“: connect('XY', array($this, 'callback')) Listener 1) Please tell me if XY happens! 3) Subject XYed with Z EventDispatcher callback($event) 2) Hey, I just XYed with Z! Subject notify(new EventXY(Z)) Mayflower GmbH I 7
  • 8.
    Internals (II) –Der DependencyInjectionContainer I Ziel: Keine konkreten Abhängigkeiten, d.h. keine direkte Instanziierung von Services mehr! $myDependency = new Services(); $container->getService(); Zur Compile-Zeit: Dependency-Graph Zur Laufzeit: Service-Pool Mayflower GmbH I 8
  • 9.
    Beispiel-Konfiguration von Doctrine doctrine: dbal: dbname: xxxxxxxx user: xxxxxxxx password: ~ logging: %kernel.debug% orm: auto_generate_proxy_classes: %kernel.debug% mappings: HelloBundle: ~ Mayflower GmbH I 9
  • 10.
    Internals (III) –Der HttpKernel I Aufgabe des HttpKernels: Transformation von Requests in Responses I Zwei Abhängigkeiten: ControllerResolver und EventDispatcher I Erweiterung des Transformationsprozesses mittels Event-Listener möglich Request HTTP-Kernel Response Mayflower GmbH I 10
  • 11.
    Praxis 12.03.11 Mayflower GmbH 11 Bild: http://www.flickr.com/photos/reway2007/2927363741/lightbox/
  • 12.
    Projektstruktur (I) Application- Configuration und Logs/Cache FrontController und Ressources Eigene Bundles Third-Party Bundles Mayflower GmbH I 12
  • 13.
    Projektstruktur (II) <?php require_once __DIR__.'/../app/bootstrap_cache.php'; require_once __DIR__.'/../app/AppCache.php'; use SymfonyComponentHttpFoundationRequest; $kernel = new AppKernel('prod', false); $kernel­>handle(Request::createFromGlobals())­>send(); Mayflower GmbH I 13
  • 14.
    Projektstruktur (II) <?php use SymfonyComponentHttpKernelKernel; use SymfonyComponentConfigLoaderLoaderInterface; class AppKernel extends Kernel {     public function registerBundles()     {         $bundles = array(             new SymfonyBundleFrameworkBundleFrameworkBundle(),             new SymfonyBundleTwigBundleTwigBundle(),             new SymfonyBundleZendBundleZendBundle(),             new SymfonyBundleDoctrineBundleDoctrineBundle(),             new PaulHelloBundleHelloBundle(),         );         if (in_array($this­>getEnvironment(), array('dev', 'test'))) {             $bundles[] = new SymfonyBundleWebProfilerBundleWebProfilerBundle();         }         return $bundles;     }     public function registerRootDir()     {         return __DIR__;     }     public function registerContainerConfiguration(LoaderInterface $loader)     {         $loader­>load(__DIR__.'/config/config_'.$this­>getEnvironment().'.yml');     } } Mayflower GmbH I 14
  • 15.
    Projektstruktur (II) <?php namespace PaulHelloBundleController; use SymfonyBundleFrameworkBundleControllerController; class HelloController extends Controller {     public function indexAction($name)     {         return $this­>render(                 'HelloBundle:Hello:index.html.twig',                 array('name' => $name));     } } Mayflower GmbH I 15
  • 16.
    Twig (Templating Engine) ISowohl als Standalone-Engine als auch als Bestandteil des Symfony-Frameworks verwendbar (http://www.twig-project.org/) I First-Class citizens: Templates und Blöcke · Base-Template: „Layout“ · Bundle-Templates erweitern das Layout · Action-Templates erweitern Bundle-Templates · … Mayflower GmbH I 16
  • 17.
    app/views/base.html.twig Layout: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>{% block title %}Hello Application{% endblock %}</title> </head> <body> {% block body %}{% endblock %} </body> </html> Bundle- src/Paul/HelloBundle/Resources/views/layout.html.twig {% extends "::base.html.twig" %} Template: {% block body %} <h1>Hello Bundle</h1> {% block content %}{% endblock %} {% endblock %} Action- src/Paul/HelloBundle/Resources/views/Hello/index.html.twig {% extends "HelloBundle::layout.html.twig" %} Template: {% block content %} Hello {{ name }}!<br /><br /> <img src="{{ asset('images/katzenbank.png') }}" /><br /> <a href="{{ path('hello', { 'name': 'Thomas' }) }}">Greet Thomas! </a> {% endblock %} Mayflower GmbH I 17
  • 18.
    ? Mayflower GmbH I 18
  • 19.
    Demo Mayflower GmbH I 19
  • 20.
    Vielen Dank fürIhre Aufmerksamkeit! Kontakt Paul Seiffert Paul.Seiffert@mayflower.de +49 89 242054 1172 Mayflower GmbH Mannhardtstrasse 6 80538 München 12.03.11 Mayflower GmbH 20