SlideShare una empresa de Scribd logo
1 de 20
Descargar para leer sin conexión
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

Más contenido relacionado

Destacado

SEODay 2011 - Seitennetzwerk mit WordPress effizient aufbauen und verwalten
SEODay 2011 - Seitennetzwerk mit WordPress effizient aufbauen und verwaltenSEODay 2011 - Seitennetzwerk mit WordPress effizient aufbauen und verwalten
SEODay 2011 - Seitennetzwerk mit WordPress effizient aufbauen und verwaltenget on top gmbh
 
One Click Deployment with Jenkins
One Click Deployment with JenkinsOne Click Deployment with Jenkins
One Click Deployment with JenkinsMayflower GmbH
 
EMA - Enterprise Managed Archive: globales Informationsmanagement clever gel...
EMA  - Enterprise Managed Archive: globales Informationsmanagement clever gel...EMA  - Enterprise Managed Archive: globales Informationsmanagement clever gel...
EMA - Enterprise Managed Archive: globales Informationsmanagement clever gel...netlogix
 
Mitarbeiter-Weblogs bei der Siemens AG
Mitarbeiter-Weblogs bei der Siemens AGMitarbeiter-Weblogs bei der Siemens AG
Mitarbeiter-Weblogs bei der Siemens AGKarsten Ehms
 
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...Mayflower GmbH
 

Destacado (8)

SEODay 2011 - Seitennetzwerk mit WordPress effizient aufbauen und verwalten
SEODay 2011 - Seitennetzwerk mit WordPress effizient aufbauen und verwaltenSEODay 2011 - Seitennetzwerk mit WordPress effizient aufbauen und verwalten
SEODay 2011 - Seitennetzwerk mit WordPress effizient aufbauen und verwalten
 
One Click Deployment with Jenkins
One Click Deployment with JenkinsOne Click Deployment with Jenkins
One Click Deployment with Jenkins
 
EMA - Enterprise Managed Archive: globales Informationsmanagement clever gel...
EMA  - Enterprise Managed Archive: globales Informationsmanagement clever gel...EMA  - Enterprise Managed Archive: globales Informationsmanagement clever gel...
EMA - Enterprise Managed Archive: globales Informationsmanagement clever gel...
 
Deployment 2.0
Deployment 2.0Deployment 2.0
Deployment 2.0
 
Mitarbeiter-Weblogs bei der Siemens AG
Mitarbeiter-Weblogs bei der Siemens AGMitarbeiter-Weblogs bei der Siemens AG
Mitarbeiter-Weblogs bei der Siemens AG
 
Why and what is go
Why and what is goWhy and what is go
Why and what is go
 
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
 
Agile Anti-Patterns
Agile Anti-PatternsAgile Anti-Patterns
Agile Anti-Patterns
 

Similar a Symfony2

Mobile Anwendungen mit SenchaTouch
Mobile Anwendungen mit SenchaTouchMobile Anwendungen mit SenchaTouch
Mobile Anwendungen mit SenchaTouchMayflower GmbH
 
FLOW3 Einführung auf dem TYPO3Camp Berlin 2012
FLOW3 Einführung auf dem TYPO3Camp Berlin 2012FLOW3 Einführung auf dem TYPO3Camp Berlin 2012
FLOW3 Einführung auf dem TYPO3Camp Berlin 2012Christof Rodejohann
 
.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1Manfred Steyer
 
YAFOWIL - Webformulare in Python ohne Kopfschmerzen
YAFOWIL - Webformulare in Python ohne KopfschmerzenYAFOWIL - Webformulare in Python ohne Kopfschmerzen
YAFOWIL - Webformulare in Python ohne KopfschmerzenJens Klein
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Shell Fu for Developers
Shell Fu for DevelopersShell Fu for Developers
Shell Fu for DevelopersMayflower GmbH
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJSSebastian Springer
 
Präsentation webservices
Präsentation webservicesPräsentation webservices
Präsentation webservicesxxtesaxx
 
Html5 workshop Peter Voringer
Html5 workshop   Peter VoringerHtml5 workshop   Peter Voringer
Html5 workshop Peter VoringerMayflower GmbH
 
PHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzePHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzeRalf Lütke
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Open icf (open identity connector framework) @ forgerock deutsch
Open icf (open identity connector framework) @ forgerock   deutschOpen icf (open identity connector framework) @ forgerock   deutsch
Open icf (open identity connector framework) @ forgerock deutschHanns Nolan
 
Tech Talk Spring Framework
Tech Talk Spring FrameworkTech Talk Spring Framework
Tech Talk Spring FrameworkJens Rühmkorf
 
Slides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdfSlides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdfAlexanderStz1
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101gueste4be40
 

Similar a Symfony2 (20)

Mobile Anwendungen mit SenchaTouch
Mobile Anwendungen mit SenchaTouchMobile Anwendungen mit SenchaTouch
Mobile Anwendungen mit SenchaTouch
 
FLOW3-Workshop F3X12
FLOW3-Workshop F3X12FLOW3-Workshop F3X12
FLOW3-Workshop F3X12
 
MVVM Pattern
MVVM Pattern MVVM Pattern
MVVM Pattern
 
FLOW3 Einführung auf dem TYPO3Camp Berlin 2012
FLOW3 Einführung auf dem TYPO3Camp Berlin 2012FLOW3 Einführung auf dem TYPO3Camp Berlin 2012
FLOW3 Einführung auf dem TYPO3Camp Berlin 2012
 
Modulsystem in Drupal
Modulsystem in DrupalModulsystem in Drupal
Modulsystem in Drupal
 
.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1
 
YAFOWIL - Webformulare in Python ohne Kopfschmerzen
YAFOWIL - Webformulare in Python ohne KopfschmerzenYAFOWIL - Webformulare in Python ohne Kopfschmerzen
YAFOWIL - Webformulare in Python ohne Kopfschmerzen
 
MVVM mit WPF
MVVM mit WPFMVVM mit WPF
MVVM mit WPF
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Shell Fu for Developers
Shell Fu for DevelopersShell Fu for Developers
Shell Fu for Developers
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
Präsentation webservices
Präsentation webservicesPräsentation webservices
Präsentation webservices
 
Html5 workshop Peter Voringer
Html5 workshop   Peter VoringerHtml5 workshop   Peter Voringer
Html5 workshop Peter Voringer
 
PHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzePHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-Ansätze
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Open icf (open identity connector framework) @ forgerock deutsch
Open icf (open identity connector framework) @ forgerock   deutschOpen icf (open identity connector framework) @ forgerock   deutsch
Open icf (open identity connector framework) @ forgerock deutsch
 
Tech Talk Spring Framework
Tech Talk Spring FrameworkTech Talk Spring Framework
Tech Talk Spring Framework
 
Slides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdfSlides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdf
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 

Más de Mayflower GmbH

JavaScript Days 2015: Security
JavaScript Days 2015: SecurityJavaScript Days 2015: Security
JavaScript Days 2015: SecurityMayflower GmbH
 
Vom Entwickler zur Führungskraft
Vom Entwickler zur FührungskraftVom Entwickler zur Führungskraft
Vom Entwickler zur FührungskraftMayflower GmbH
 
Salt and pepper — native code in the browser Browser using Google native Client
Salt and pepper — native code in the browser Browser using Google native ClientSalt and pepper — native code in the browser Browser using Google native Client
Salt and pepper — native code in the browser Browser using Google native ClientMayflower GmbH
 
Plugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingPlugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingMayflower GmbH
 
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...Mayflower GmbH
 
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
Native Cross-Platform-Apps mit Titanium Mobile und AlloyNative Cross-Platform-Apps mit Titanium Mobile und Alloy
Native Cross-Platform-Apps mit Titanium Mobile und AlloyMayflower GmbH
 
Pair Programming Mythbusters
Pair Programming MythbustersPair Programming Mythbusters
Pair Programming MythbustersMayflower GmbH
 
Shoeism - Frau im Glück
Shoeism - Frau im GlückShoeism - Frau im Glück
Shoeism - Frau im GlückMayflower GmbH
 
Bessere Software schneller liefern
Bessere Software schneller liefernBessere Software schneller liefern
Bessere Software schneller liefernMayflower GmbH
 
Von 0 auf 100 in 2 Sprints
Von 0 auf 100 in 2 SprintsVon 0 auf 100 in 2 Sprints
Von 0 auf 100 in 2 SprintsMayflower GmbH
 
Piwik anpassen und skalieren
Piwik anpassen und skalierenPiwik anpassen und skalieren
Piwik anpassen und skalierenMayflower GmbH
 
Agilitaet im E-Commerce - E-Commerce Breakfast
Agilitaet im E-Commerce - E-Commerce BreakfastAgilitaet im E-Commerce - E-Commerce Breakfast
Agilitaet im E-Commerce - E-Commerce BreakfastMayflower GmbH
 
Mongo DB - Segen oder Fluch
Mongo DB - Segen oder FluchMongo DB - Segen oder Fluch
Mongo DB - Segen oder FluchMayflower GmbH
 
Test-Driven JavaScript Development IPC
Test-Driven JavaScript Development IPCTest-Driven JavaScript Development IPC
Test-Driven JavaScript Development IPCMayflower GmbH
 

Más de Mayflower GmbH (20)

JavaScript Days 2015: Security
JavaScript Days 2015: SecurityJavaScript Days 2015: Security
JavaScript Days 2015: Security
 
Vom Entwickler zur Führungskraft
Vom Entwickler zur FührungskraftVom Entwickler zur Führungskraft
Vom Entwickler zur Führungskraft
 
Produktive teams
Produktive teamsProduktive teams
Produktive teams
 
Salt and pepper — native code in the browser Browser using Google native Client
Salt and pepper — native code in the browser Browser using Google native ClientSalt and pepper — native code in the browser Browser using Google native Client
Salt and pepper — native code in the browser Browser using Google native Client
 
Plugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingPlugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debugging
 
Usability im web
Usability im webUsability im web
Usability im web
 
Rewrites überleben
Rewrites überlebenRewrites überleben
Rewrites überleben
 
JavaScript Security
JavaScript SecurityJavaScript Security
JavaScript Security
 
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
 
Responsive Webdesign
Responsive WebdesignResponsive Webdesign
Responsive Webdesign
 
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
Native Cross-Platform-Apps mit Titanium Mobile und AlloyNative Cross-Platform-Apps mit Titanium Mobile und Alloy
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
 
Pair Programming Mythbusters
Pair Programming MythbustersPair Programming Mythbusters
Pair Programming Mythbusters
 
Shoeism - Frau im Glück
Shoeism - Frau im GlückShoeism - Frau im Glück
Shoeism - Frau im Glück
 
Bessere Software schneller liefern
Bessere Software schneller liefernBessere Software schneller liefern
Bessere Software schneller liefern
 
Von 0 auf 100 in 2 Sprints
Von 0 auf 100 in 2 SprintsVon 0 auf 100 in 2 Sprints
Von 0 auf 100 in 2 Sprints
 
Piwik anpassen und skalieren
Piwik anpassen und skalierenPiwik anpassen und skalieren
Piwik anpassen und skalieren
 
Agilitaet im E-Commerce - E-Commerce Breakfast
Agilitaet im E-Commerce - E-Commerce BreakfastAgilitaet im E-Commerce - E-Commerce Breakfast
Agilitaet im E-Commerce - E-Commerce Breakfast
 
Mongo DB - Segen oder Fluch
Mongo DB - Segen oder FluchMongo DB - Segen oder Fluch
Mongo DB - Segen oder Fluch
 
Schnelle Geschäfte
Schnelle GeschäfteSchnelle Geschäfte
Schnelle Geschäfte
 
Test-Driven JavaScript Development IPC
Test-Driven JavaScript Development IPCTest-Driven JavaScript Development IPC
Test-Driven JavaScript Development IPC
 

Symfony2

  • 1. Symfony2 Paul Seiffert I 03.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) 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
  • 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ü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