1. 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!
3. 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
4. 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
5. Drupal SUCKS for your’e looking
Well, maybe just if developers!! for a framework
6. 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..
7. 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
8. 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).
10. 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)
11. 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
12. 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’);
13. 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.
14. 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…
15. 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!
16. 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);
}
}
17. 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’);
18. 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 (-:
19. 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
21. 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 (-: