For start – let’s think of this simple task!
All we would like to do is echo query string param to the screen..
// Route: hello?name=world

$hello = $_GET[‘name’];

printf(‘Hello %s’ , $hello); // Outputs ‘world’ and a warning



Think about that!
Symfony2 meets Drupal 8


Author: Ran Mizrahi (@ranm8)
        Open Source Department Leader
About CodeOasis

• CodeOasis specializes in advanced web
  solutions.

• Large variety of customers (from startups to
  retail companies and enterprises)

• Two main technology environments:
  • Open Source – PHP, JS and rich HTML5 and
    CSS3 client side applications
  • Microsoft .NET
Drupal is Awesome!!!

                    !?!?!!?
• End users - A way to create your own tailored made CMS
  - It’s great for our end users
• Salesmen - Known brand with many major use cases! -
  It’s great for a salesman
Drupal SUCKS for your’e looking
Well, maybe just if developers!! for a framework
Drupal Started as a CMS and evolved to a CMF!
The Problems:

• Larger websites are developed using Drupal content
  management abilities – Lots of code is written.

• BIG learning curve for both junior and experienced
  developers – Learn the “Drupal Way” (Procedural AOP)

• Lack of web development drivers/components

• Legacy code – Well, like every 11 years old software..
What is Symfony2??



"Symfony2 is a reusable set of standalone,
decoupled, and cohesive PHP components
that solves common web development
problems.”

Fabian Potencier – Symfony’s project lead
So, why use Syfmony2 in Drupal 8

• Symfony2 provides a great set of standalone,
  independent PHP components that solve common web
  problems. (HttpFoundation, ClassLoader,
  EventDispatcher, etc.)

• Move to the next generation PHP OOP features that are
  available from PHP 5.3 and above

• The PSR (PHP Standard Recommendation) standard –
  Allows easy-lazy-class-loader (by not bootstrapping code
  we don’t need).
Symfony2 Components in Drupal 8
PSR (PHP Recommended Standards)
• Set of PHP recommended standards by agreed and
  embraced by PHP most popular projects
  (Symfony, Drupal, Zend, CakePHP, Joomla, phpBB, etc.)

• Suggested coding standards for:
   • Naming conventions for autoloading (PSR-0)
   • Basic coding standards (PSR-1)
   • Coding style guide (PSR-2)
ClassLoader

• ClassLoader loads your project classes automatically if
  they follow the PSR-0 standard naming convention

• One universal class autoloader that follows PHP known
  standards

• Lazy-loading-class-loader
ClassLoader
Example

require_once __DIR__ . ’/ClassLoader/UniversalClassLoader.php';

use SymfonyComponentClassLoaderUniversalClassLoader;

$loader = new UniversalClassLoader();
$loader->register();

// Now we can register some namespaces…
$loader->registerNamespace(‘Symfony’, __DIR__ . ‘/src’);
HttpFoundation

• HttpFoundation wraps HTTP specification (PHP super
  globals - $_GET, $_SESSION, $_POST, $_COOKIE, $_FILE,
  etc. for request and echo, header, setcookie, etc. for
  response) with OO layer

• It provides abstraction for HTTP requests, responses,
  cookies, session, uploaded files, etc.
HttpFoundation
Let’s start with a simple task:
// Route: hello?name=world

$hello = $_GET[‘name’];

printf(‘Hello %s’ , $hello); // Outputs ‘world’ and a warning

It turns out to be not that simple, now we’ve got PHP warning:
// Route: hello?name=world

$hello = isset($_GET[‘name’]) ? $_GET[‘name’] : ‘World’;

printf(‘Hello %s’ , $hello); // Outputs ‘world’


OK, what now?! Yes, we have XSS issue )-: Let’s fix…
HttpFoundation

// Route: hello?name=world

$hello = isset($_GET[‘name’]) ? $_GET[‘name’] : ‘World’;

printf(‘Hello %s’ , htmlspecialchars($hello, END_QUOTES, ‘UTF-8’));
// Outputs ‘world’


Hard job for a simple task and makes our code look… UGLY!
HttpFoundation
This is how our code will look like using HttpFoundation:
// /hello?name=world
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;

$request = Request::createFromGlobals();
echo ‘Hello’ . $request->query->get(‘name’ , ‘World’); // Outputs ‘world’

And it’s great for unit testing (-:
class HelloTest extends PHPUnit_Framework_TestCase {
     public function testHello() {
           $request = Request::create('/?name=world', 'GET');
           $helloClass = new Hello();
           $content = $helloClass->sayHello();
           $this->assertsEquals(’Hello world’, $content);
     }
}
EventDispatcher
• The EventDispatcher is lightweight implementation of
  the Observer design pattern

• Provides the ability to dispatch and listen to events.

use SymfonyComponentEventDispatcherEventDispatcher;
use SymfonyComponentEventDispatcherEvent;

$dispatcher = new EventDispatcher();

$dispatcher->addListener(‘new_node’ , function(Event $event) {
     // React to the event
});

$dispatcher->dispatch(‘new_node’);
EventDispatcher

So how will it fit in Drupal (Larry Garfield’s prediction )

• Drupal 8 will have both hooks and EventDispatcher

• EventDispatcher will be closer to the core, hooks further
  out

• Drupal 9, maybe only event dispatcher ?!? I hope so (-:
Templates - Twig (Maybe?)

What is Twig?

• Twig is a template engine for PHP

• Uses it’s own template syntax, originally inspired from
  Jinja and Django (According to Wikipedia)

• Symfony2 uses Twig as main template engine

• Twig was written by Fabian Potencier
Templates - Twig (Maybe?)

PHPTemplate:
<div>
     <?php if ($content): ?>
     <span><?php echo $content; ?></span>
     <span><?php echo htmlspecialchars($content, ENT_QUOTES, ‘UTF-8’); ?>
</span>
     <?php endif; ?>
</div>
Twig:
<div>
     {% if content %}
     <span>{{ content }}</span>
     <span>{{ content|escape }}</span>
     {% endif %}
</div>
Templates - Twig (Maybe?)

Why Twig is good for us:

• Secure

• Front-end developer friendly (No PHP knowledge is
  required

• Not Drupal-proprietary.

• Great way to make sure that logics won’t find a place on
  Drupal templates (-:
Contact me @ranm8 on twitter
Mail : ranm@codeoasis.com