Sie sind auf Seite 1von 131

meets

http://www.flickr.com/photos/nimport_nawak/3404931191

Fabien Potencier
@fabpot fabien@symfony.com

Founder of Lead developer of Open-Source libraries


Twig, Swiftmailer, Silex, Pirum, Sismo, Pimple, Goutte, ...

Symfony founder and lead developer

Drupal 8 meets Symfony

Lukas Kahwe Smith


@lsmith smith@pooteeweet.org

Works for in Switzerland PHP 5.3 Release Manager Co-lead of PHPCR Symfony2 core contributor

Drupal 8 meets Symfony

How many of you are

PHP developers?

http://www.flickr.com/photos/dunechaser/160405823

Drupal 8 meets Symfony

How many of you are

Symfony aware?

http://www.flickr.com/photos/dunechaser/142079357

Drupal 8 meets Symfony

We are both outsiders

We are both quite experienced PHP developers

We have a rough understanding of the hook paradigm aka the Drupal way
http://www.flickr.com/photos/pictureperfectpose/76138988

Drupal 8 meets Symfony

A sad realization
It would take a long time for us to be productive in Drupal let alone work on the core And everything we learn along the way would only help us with Drupal

Drupal 8 meets Symfony

What others do
Building on top of long established OO design patterns Leverage new PHP language features and performance improvements Share code!

Drupal 8 meets Symfony

So Drupal is wrong?
No, the question is just if the benefits of doing things differently outweigh the disadvantages

Drupal 8 meets Symfony

Core brain drain


The complexity of the custom code thats used and the non-standard architecture combines to create a barrier to entry for developers new to Drupal (both experienced and novice developers alike).
buytaert.net

Drupal 8 meets Symfony

What could be gained


Facilitate the refactoring towards a framework core Focus Drupal dev resources on the CMS Easier integration with other applications Ensure that the Drupal developer pool continues to grow
Drupal 8 meets Symfony

A decision was made


While these changes may seem large, and some of them are, we believe that they will achieve the right balance between empowering Drupal's design and architecture, and moving toward more modern, standard, well-tested code and techniques to empower a new generation of developers.
buytaert.net
Drupal 8 meets Symfony

How to collaborate?
Symfony2 is MIT licensed which is GPL compatible Symfony2 development is very transparently managed on github.com We want to ensure Symfony2 works for Drupal, phpBB, etc.
Drupal 8 meets Symfony

For example ...


Symfony2.0 provides a concept called flash messages to pass messages to the very next request drupal_set_message() could be replaced by this if we make it a bit more flexible Drak, lead of the Zikula CMS, created a PR to address exactly these concerns

Drupal 8 meets Symfony

Symfony?

What is

http://www.flickr.com/photos/apranihita/141159146/

Drupal 8 meets Symfony

http://www.flickr.com/photos/bigpinkcookie/22716359

Drupal 8 meets Symfony

is... ... a reusable set of standalone, decoupled, and cohesive PHP components that solve common web development problems
http://www.flickr.com/photos/krislitman/493626935

Drupal 8 meets Symfony

is... ... an Object-Oriented set of classes ... compatible with PHP 5.3 and later
http://www.flickr.com/photos/krislitman/493626935

Drupal 8 meets Symfony

Config

ClassLoader
Finder

Process

Console

Filesystem

EventDispatcher
BrowserKit CssSelector DomCrawler

HttpFoundation HttpKernel Routing


Yaml
Serializer Security Locale Validator
Templating

DependencyInjection
Translation Form

Drupal 8 meets Symfony

is... ... a full-stack web framework

http://www.flickr.com/photos/krislitman/493626935

Drupal 8 meets Symfony

Official website http://symfony.com/ Official repository https://github.com/symfony/symfony


http://www.flickr.com/photos/28634332@N05/5654415647

Drupal 8 meets Symfony

Components

Official website http://symfony.com/components Official repositories https://github.com/symfony/XXXX


http://www.flickr.com/photos/28634332@N05/5654415647

Drupal 8 meets Symfony

Mailing-list https://groups.google.com/group/symfony2 IRC channel irc://irc.freenode.net/symfony


http://www.flickr.com/photos/28634332@N05/5654415647

Drupal 8 meets Symfony

Which Open-Source projects

are already using the


Symfony Components?

http://www.flickr.com/photos/maistora/3014414972

Drupal 8 meets Symfony

Developer Tools Behat - a BDD framework


Console, DependencyInjection, EventDispatcher, Finder, Yaml, Config, Translation

Doctrine - an object relational mapper


Console, Yaml

Propel - an object relational mapper


Console, ClassLoader, Yaml

PHPUnit - a PHP unit testing framework


Yaml, (Finder soon?)

Jackalope - a content repository (JCR 170/283)


ClassLoader, Console
http://www.flickr.com/photos/c_r_i_s/77763712

Drupal 8 meets Symfony

Frameworks Silex - a micro-framework


BrowerKit, CssSelector, DomCrawler, EventDispatcher, HttpFoundation, HttpKernel, Routing, Form, Translation, Validator

PPI 2 - a framework
ClassLoader, HttpFoundation, Routing, Templating

http://www.flickr.com/photos/c_r_i_s/77763712

Drupal 8 meets Symfony

Products easybook - a book publishing platform


ClassLoader, Console, EventDispatcher, Filesystem, Finder, Yaml

Midgard CMS - a content management framework


uses the full-stack framework

Zikula - ex PostNuke - an application framework


HttpFoundation, HttpKernel, EventDispatcher, ClassLoader, DependencyInjection

phpBB - a bulletin board software


EventDispatcher, and most of them for version 4?
http://www.flickr.com/photos/c_r_i_s/77763712

Drupal 8 meets Symfony

What about

Drupal 8?

http://www.flickr.com/photos/aloshbennett/619307160

Drupal 8 meets Symfony

Config

ClassLoader
Finder

Process

Console

Filesystem

EventDispatcher
BrowserKit CssSelector DomCrawler

HttpFoundation HttpKernel Routing


Yaml
Serializer Security Locale Validator
Templating

DependencyInjection
Translation Form

Drupal 8 meets Symfony

Config

ClassLoader
Finder

Process

Console

Filesystem

EventDispatcher
BrowserKit CssSelector DomCrawler

HttpFoundation HttpKernel Routing


Yaml
Serializer Security Locale Validator
Templating

DependencyInjection
Translation Form

Drupal 8 meets Symfony

Using the

Symfony
Components

http://www.flickr.com/photos/35168673@N03/6086229920

Drupal 8 meets Symfony

Git

$ $ $ $

git git git git

clone https://github.com/symfony/Console.git co v2.0.9 co 2.0 co master

Drupal 8 meets Symfony

Archives

$ curl -O https://github.com/symfony/Console/zipball/v2.0.9 $ curl -O https://github.com/symfony/Console/zipball/2.0 $ curl -O https://github.com/symfony/Console/zipball/master

Drupal 8 meets Symfony

PEAR

$ pear channel-discover pear.symfony.com $ pear install symfony2/Console-2.0.9

Drupal 8 meets Symfony

Composer
composer.json { "require": { "symfony/console": "2.1.*", "symfony/http-foundation": "v2.0.9" } } curl -s http://getcomposer.org/installer | php php composer.phar install

Drupal 8 meets Symfony

Symfony Components

comes with Drupal 8


Drupal 8 meets Symfony

ClassLoader

Drupal 8 meets Symfony

http://symfony.com/PSR0

Drupal 8 meets Symfony

require_once __DIR__.'/src/Symfony/Component/ ClassLoader/UniversalClassLoader.php'; use Symfony\Component\ClassLoader\UniversalClassLoader; $loader = new UniversalClassLoader(); $loader->registerNamespaces(array( 'Symfony' => __DIR__.'/vendor/symfony/src', )); $loader->register();

Drupal 8 meets Symfony

$loader->registerPrefixes(array( 'Twig_' => __DIR__.'/vendor/twig/lib', ));

Drupal 8 meets Symfony

The Symfony ClassLoader Component loads your project classes automatically if they follow some standard conventions
http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

HttpFoundation

Drupal 8 meets Symfony

HTTP
HTTP/1.1 RFC 2616

http://www.ietf.org/rfc/rfc2616.txt http://tools.ietf.org/wg/httpbis/
http://www.flickr.com/photos/deniscollette/6741424757

Drupal 8 meets Symfony

The Web in action The User asks for a Resource in a Browser


http://example.com/foo.html

Drupal 8 meets Symfony

The Web in action The User asks for a Resource in a Browser The Browser sends a Request to the Server
GET /foo.html HTTP/1.1 Host: example.com

Drupal 8 meets Symfony

The Web in action The User asks for a Resource in a Browser The Browser sends a Request to the Server The Server sends back a Response to the Browser
HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html Hello World!
Drupal 8 meets Symfony

The Web in action The User asks for a Resource in a Browser The Browser sends a Request to the Server The Server sends back a Response to the Browser The Browser displays the Resource to the User

Drupal 8 meets Symfony

Client
Request
GET /foo.html HTTP/1.1 Host: example.com

The Client sends a Request to the Server


Internet
Response

The Server sends back a Response to the Client


Server

HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html Hello World!

Drupal 8 meets Symfony

Request

GET /foo.html HTTP/1.1 Host: example.com

http://www.flickr.com/photos/splorp/64027565

Drupal 8 meets Symfony

Request
GET /foo.html HTTP/1.1 Host: example.com

session_start(); $name = $_GET['name']; // $_POST, $_FILE, $_COOKIE, ... echo $_SESSION['name']; $method = $_SERVER['REQUEST_METHOD'];

Drupal 8 meets Symfony

Request
GET /foo.html HTTP/1.1 Host: example.com

$clientIp = $_SERVER['REMOTE_ADDR'];

Drupal 8 meets Symfony

Request
GET /foo.html HTTP/1.1 Host: example.com

if (isset($_SERVER['HTTP_CLIENT_IP'])) { return $_SERVER['HTTP_CLIENT_IP']; } if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'], 2); return isset($ips[0]) ? trim($ips[0]) : ''; } return $_SERVER['REMOTE_ADDR'];

Drupal 8 meets Symfony

Request
GET /foo.html HTTP/1.1 Host: example.com

if ($trustProxy) { if (isset($_SERVER['HTTP_CLIENT_IP'])) { return $_SERVER['HTTP_CLIENT_IP']; } if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'], 2); return isset($ips[0]) ? trim($ips[0]) : ''; } } return $_SERVER['REMOTE_ADDR'];
Drupal 8 meets Symfony

Request

Not Object-Oriented Singleton like Low-level abstraction only Not Object-Oriented

GET /foo.html HTTP/1.1 Host: example.com

http://www.flickr.com/photos/viamoi/3338093351

Drupal 8 meets Symfony

Request
GET /foo.html HTTP/1.1 Host: example.com

use Symfony\Component\HttpFoundation\Request; $request = Request::createFromGlobals(); $request = Request::create('/hello.html', 'GET'); $request->overrideGlobals();

Drupal 8 meets Symfony

Request
GET /foo.html HTTP/1.1 Host: example.com

$request->query->get('name', 'Default'); $request->getSession()->get('name'); $request->getPathInfo(); $request->getClientIp(); Request::trustProxyData();

Drupal 8 meets Symfony

Response

HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html Hello World!

http://www.flickr.com/photos/splorp/64027565

Drupal 8 meets Symfony

Response
HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html Hello World!

header('HTTP/1.0 404 Not Found'); header('Content-Type: text/html; charset=UTF-8'); setcookie('name', $name); $_SESSION['name'] = 'Fabien'; echo 'Hello '.$name;

Drupal 8 meets Symfony

Response
HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html

Singleton like Low-level abstraction only Does not play well with the CLI Not Object-Oriented

Hello World!

http://www.flickr.com/photos/viamoi/3338093351

Drupal 8 meets Symfony

Response
HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html Hello World!

use Symfony\Component\HttpFoundation\Response; $response = new Response('Not Found', 404, array('Content-Type' => 'text/plain')); $response = new Response(); $response->setContent('Hello World'); $response->send();

Drupal 8 meets Symfony

Response
HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html Hello World!

use Symfony\Component\HttpFoundation\StreamedResponse; $response = new StreamedResponse(function () { echo 'foo'; flush(); echo 'bar'; }); $response->send();

Drupal 8 meets Symfony

Response
HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html Hello World!

$headers = $response->headers; $headers->set( 'Content-Disposition', $headers->makeDisposition( ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'foo.pdf') );

Drupal 8 meets Symfony

Response
HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html Hello World!

$response->prepare($request);

Drupal 8 meets Symfony

Session Management

http://www.flickr.com/photos/tomvu/5371659662

Drupal 8 meets Symfony

The Symfony HttpFoundation Component defines a feature-full object-oriented layer for the HTTP messages
http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

It replaces PHP native global variables and functions to allow writing better, more secure, and more testable code

http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

Routing

Drupal 8 meets Symfony

use Symfony\Component\Routing\Route; $route = new Route('/node/{id}', array( '_controller' => 'SomeClass::someMethod' )); use Symfony\Component\Routing\RouteCollection; $routes = new RouteCollection(); $routes->add('node', $route);

Drupal 8 meets Symfony

use Symfony\Component\Routing\RequestContext; use Symfony\Component\Routing\Matcher\UrlMatcher; $matcher = new UrlMatcher($routes, new RequestContext()); $attributes = $matcher->match('/node/12'); $attributes = $matcher->match($request->getPathInfo()); print_r($attributes); array( '_route' => 'node', 'id' => 12, '_controller' => 'SomeClass::someMethod', );
Drupal 8 meets Symfony

use Symfony\Component\Routing\Generator\UrlGenerator; $generator = new UrlGenerator($routes, $context); echo $generator->generate('node', array('id' => 12));

Drupal 8 meets Symfony

The Symfony Routing Component decouples the look of URLs from the code that handle them
http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

EventDispatcher

Drupal 8 meets Symfony

use Symfony\Component\EventDispatcher\EventDispatcher; $dispatcher = new EventDispatcher(); $callable = function (Event $event) { // do something }; $dispatcher->addListener('event_name', $callable);

$dispatcher->dispatch('event_name', new Event());

Drupal 8 meets Symfony

The Symfony EventDispatcher Component implements a lightweight version of the Observer design pattern
http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

HttpKernel

Drupal 8 meets Symfony

Request
GET /foo.html HTTP/1.1 Host: example.com

Response
HTTP/1.1 200 OK Date: Wed, 15 Oct 2005 07:07:07 GMT Content-Length: 14 Content-Type: text/html Hello World!

http://www.flickr.com/photos/-bast-/349497988

Drupal 8 meets Symfony

The web in action


The User asks for a Resource in a Browser The Browser sends a Request to the Server

Symfony gives the Developer a Request Object The Developer converts the Request Object to a Response Object
The Server sends back a Response to the Browser The Browser displays the Resource to the User

Drupal 8 meets Symfony

namespace Symfony\Component\HttpKernel; interface HttpKernelInterface { /** * @return Response A Response instance */ function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true); }

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

Workflow

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

namespace Symfony\Component\HttpKernel\Controller; interface ControllerResolverInterface { function getController(Request $request); function getArguments(Request $request, $controller); }

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

$routes = new RouteCollection(); $routes->add('hello', new Route('/hello', array('_controller' => function (Request $request) { return new Response(sprintf("Hello %s", $request->get('name'))); } ))); $request = Request::createFromGlobals(); $matcher = new UrlMatcher($routes, new RequestContext()); $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new RouterListener($matcher)); $resolver = new ControllerResolver(); $kernel = new HttpKernel($dispatcher, $resolver); $kernel->handle($request)->send();

Drupal 8 meets Symfony

Symfony

built-in
listeners
http://www.flickr.com/photos/c_r_i_s/67306260

Drupal 8 meets Symfony

$handler = function ($exception) { return new Response($exception->getMessage(), 500); }); $dispatcher->addSubscriber(new ExceptionListener($handler));

Drupal 8 meets Symfony

$handler = function ($exception) { $handler = new ExceptionHandler(); return $handler->createResponse($exception); }); $dispatcher->addSubscriber(new ExceptionListener($handler));

Drupal 8 meets Symfony

Drupal 8 meets Symfony

The default HttpKernel implementation makes Drupal interoperable with any other software using the same
http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

HTTP
Testing

http://www.flickr.com/photos/cmogle/2947179118

Drupal 8 meets Symfony

use Symfony\Component\HttpKernel\Client; $client = new Client($kernel); $client->request('GET', '/hello/Fabien'); $response = $client->getResponse(); $this->assertEquals(200, $response->getStatusCode());

Drupal 8 meets Symfony

use Symfony\Component\HttpKernel\Client; $client = new Client($kernel); $crawler = $client->request('GET', '/hello/Fabien'); $nodes = $crawler->filter('h1:contains("Fabien")'); $this->assertCount(1, $nodes);

Drupal 8 meets Symfony

Caching

HTTP

http://www.flickr.com/photos/laserstars/908946494

Drupal 8 meets Symfony

Expiration
Cache-Control Expires

Validation
Last-Modified If-Modified-Since ETag If-None-Match

$response->setTtl(10); $response->setClientTtl(10);

Drupal 8 meets Symfony

// get the last modified date as fast as you can $lastModified = ...; $response = new Response(); $response->setLastModified($lastModified); if ($response->isNotModified($request)) { return $response; } // do the expensive work $response->setContent(...); return $response;

Drupal 8 meets Symfony

Expiration wins over Validation

http://www.flickr.com/photos/hoyvinmayvin/4672922637

Drupal 8 meets Symfony

$kernel = new HttpKernel($dispatcher, $resolver); $kernel = new HttpCache($kernel, new Store($cacheDir));

Drupal 8 meets Symfony

Varnish
accelerator

The HTTP

http://www.flickr.com/photos/stuckincustoms/3232133635

Drupal 8 meets Symfony

Using the default HttpKernel allows Drupal to benefit from the many built-in features
http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

Edge

Side
Includes

http://www.w3.org/TR/esi-lang

ESI
h"p://www.ickr.com/photos/bored-now/2264811719

Drupal 8 meets Symfony

Drupal 8 meets Symfony

Drupal 8 meets Symfony

HTTP Validation

Drupal 8 meets Symfony

HTTP Validation HTTP Expiration

Drupal 8 meets Symfony

<esi:include src="..." />

Drupal 8 meets Symfony

Sub-Request expection sub-response content exception

Request

request

resolve controller

controller

resolve arguments

Call Controller

response

Response

view

terminate

response?

Drupal 8 meets Symfony

HTTP Expiration

Drupal 8 meets Symfony

GET /foo HTTP/1.1 Host: foo.org

GET /foo HTTP/1.1 Host: foo.org HTTP/1.1 200 OK C-C: s-maxage=600


Lorem ipsum dolor <esi:include src="h4p.." />

Your PHP application

Reverse Proxy Cache

Browser

GET /bar HTTP/1.1 Host: foo.org HTTP/1.1 200 OK C-C: s-maxage=5


Lorem ipsum dolor

HTTP/1.1 200 OK
Lorem ipsum Lorem dolor sit amet, ipsum dolor

GET /bar C-C: s-maxage=5 Lorem GET /foo C-C: s-maxage=600 Lor <esi:include />

GET /foo HTTP/1.1 Host: foo.org

Your PHP application

HTTP/1.1 200 OK
Lorem ipsum Lorem dolor sit amet, ipsum dolor

GET /bar C-C: s-maxage=5 Lorem GET /foo C-C: s-maxage=600 Lor <esi:include />

before exp.

Reverse Proxy Cache

Browser

GET /foo HTTP/1.1 Host: foo.org

Your PHP application

Reverse Proxy Cache

Browser

GET /bar HTTP/1.1 Host: foo.org HTTP/1.1 200 OK C-C: s-maxage=5


Lorem ipsum dolor

HTTP/1.1 200 OK
Lorem ipsum Lorem dolor sit amet, ipsum dolor

GET /bar C-C: s-maxage=5 Lorem GET /foo C-C: s-maxage=600 Lor <esi:include />

after exp.

$kernel = new HttpCache( $kernel, new Store($cacheDir), new Esi() );

Drupal 8 meets Symfony

Varnish
accelerator

The HTTP

http://www.flickr.com/photos/stuckincustoms/3232133635

Drupal 8 meets Symfony

The Symfony HttpKernel Component provides the building blocks to create flexible, extensible, and scalable HTTP-based frameworks
http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

The Symfony HttpKernel Component leverages the HTTP specification to make integration between projects easy

http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

http://symfony.com/components
Config

ClassLoader
Finder

Process

Console

Filesystem

EventDispatcher
BrowserKit CssSelector DomCrawler

HttpFoundation HttpKernel Routing


Yaml
Serializer Security Locale Validator
Templating

DependencyInjection
Translation Form

http://www.flickr.com/photos/ecstaticist/3860865429

Drupal 8 meets Symfony

Silex

https://github.com/fabpot/Silex http://silex.sensiolabs.org/
http://www.flickr.com/photos/linhngan/2715287035

Drupal 8 meets Symfony

Build your own

framework
http://fabien.potencier.org/build-a-framework
http://www.flickr.com/photos/linhngan/2715287035

Drupal 8 meets Symfony

http://live.symfony.com/

Drupal 8 meets Symfony

The Symfony Components provides the low-level building blocks that you need to build a web product so that YOU can focus on what matters most for Drupal
http://www.flickr.com/photos/ynaffitx/4667769355

Drupal 8 meets Symfony

@fabpot @lsmith

http://www.flickr.com/photos/stevendepolo/4582437563

Drupal 8 meets Symfony

Das könnte Ihnen auch gefallen