Post on 06-May-2015
description
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
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 %}