20
© Mayflower GmbH 2010 Symfony2 Paul Seiffert I 03.03.2011

Symfony2

Embed Size (px)

DESCRIPTION

- Eckdaten des Frameworks - Architektur & Internals - Mikrokernel und Architektur des Frameworks - Architektur des Frameworks mit eigenen Bundles - Überblick Kernel-Komponenten - Der EventDispatcher - Der DependencyInjectionContainer - Beispiel-Konfigurationdes des DICs - Der HttpKernel - Projektstruktur - apps-, web-, src- und vendor-Verzeichnis - Beispiel-FrontController - Beispiel-AppKernel - Beispiel-Controller-Klasse - Die Templating-Engine Twig - Beispiel Layout/Templates - Demo

Citation preview

© Mayflower GmbH 2010

Symfony2

Paul Seiffert I 03.03.2011

Mayflower GmbH I 2

Eckdaten

Ausgewachsenes PHP-Framework

Komplette Neuentwicklung

~ 755 PHP-Klassen in 975 .php-Dateien

12.03.11 Mayflower GmbH 3

Architektur und Internals

Bild: http://www.flickr.com/photos/army_arch/3343321507/sizes/z/in/photostream/

Mayflower GmbH I 4

Architektur (I)

I Basis: Überschaubarer Microkernel (Symfony Components)

I „Everything else is a bundle“

Kernel

MVC Doctrine Twig Security

Mayflower GmbH I 5

Architektur (II)

UserBlogShopThird-Party Bundles

Application Bundles

Kernel

MVC Doctrine Twig Security

Mayflower GmbH I 6

Architektur (III) – Der Kernel

I Abstraktion über PHP-Funktionen / System Calls

I Objekt-Orientierte Schnittstelle zu HTTP

I Schlüsselfunktionalitäten im Zusammenspiel des Frameworks

Finder Serializer ValidatorProcess

HttpFoundation BrowserKit

EventDispatcher HttpKernel DependencyInjection

Sammlung von Komponenten:

Mayflower GmbH I 7

Internals (I) – Der EventDispatcher

Ein „globales Observer-Pattern“:

Listener

EventDispatcher

Subject

1) Please tell me if XY happens!

2) Hey, I just XYed with Z!

3) Subject XYed with Z

connect('XY', array($this, 'callback'))

notify(new EventXY(Z))

callback($event)

Mayflower GmbH I 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 9

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

Beispiel-Konfiguration von Doctrine

Mayflower GmbH I 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

HTTP-Kernel

Request

Response

12.03.11 Mayflower GmbH 11

Praxis

Bild: http://www.flickr.com/photos/reway2007/2927363741/lightbox/

Mayflower GmbH I 12

Projektstruktur (I)

Eigene Bundles

Third-Party Bundles

FrontController und Ressources

Application-Configuration und

Logs/Cache

Mayflower GmbH I 13

Projektstruktur (II)

<?php

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

use Symfony\Component\HttpFoundation\Request;

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

Mayflower GmbH I 14

Projektstruktur (II)

<?php

use Symfony\Component\HttpKernel\Kernel;use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel{    public function registerBundles()    {        $bundles = array(            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),            new Symfony\Bundle\TwigBundle\TwigBundle(),            new Symfony\Bundle\ZendBundle\ZendBundle(),            new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),

            new Paul\HelloBundle\HelloBundle(),        );

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

        return $bundles;    }

    public function registerRootDir()    {        return __DIR__;    }

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

Mayflower GmbH I 15

Projektstruktur (II)

<?php

namespace Paul\HelloBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

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

Mayflower GmbH I 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 17

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

Layout:

Bundle-Template:

Action-Template:

app/views/base.html.twig

{% extends "HelloBundle::layout.html.twig" %}

{% block content %} Hello {{ name }}!<br /><br />

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

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

src/Paul/HelloBundle/Resources/views/Hello/index.html.twig

src/Paul/HelloBundle/Resources/views/layout.html.twig{% extends "::base.html.twig" %}

{% block body %} <h1>Hello Bundle</h1>

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

Mayflower GmbH I 18

?

Mayflower GmbH I 19

Demo

12.03.11 Mayflower GmbH 20

Vielen Dank für Ihre Aufmerksamkeit!

Kontakt Paul Seiffert

[email protected]

+49 89 242054 1172

Mayflower GmbH

Mannhardtstrasse 6

80538 München