SlideShare a Scribd company logo
phpBB4 meets Symfony2
      Fabien Potencier
symfony 1 vs Symfony2
MVC
namespace ApplicationHelloBundleController;
use SymfonyBundleFrameworkBundleController;

class HelloController extends Controller
{
  public function indexAction($name)
  {
    // Get things from the Model

        return $this->render(
           'HelloBundle:Hello:index',
           array('name' => $name)
        );
    }
}
<?php $view->extend('HelloBundle::layout') ?>

Hello <?php echo $name ?>!
<html>
    <head>
         <title>
           <?php $view['slots']->output('title') ?>
         </title>
    </head>
    <body>
        <?php $view['slots']->output('_content') ?>
    </body>
</html>
title

         Lorem	
  ipsum	
  dolor	
  sit	
  amet,	
  consectetur	
  adipiscing	
  elit.	
  In	
  vel	
  
                                                                                                  _content
         Lorem	
  ipsum	
  dolor	
  sit	
  amet,	
  consectetur	
  adipiscing	
  elit.	
  In	
  vel	
  nulla	
  arcu,	
  
         vitae	
  cursus	
  nunc.	
  Integer	
  semper	
  turpis	
  et	
  enim	
  por6tor	
  iaculis.	
  Nulla	
  
         facilisi.	
  Lorem	
  ipsum	
  dolor	
  sit	
  amet,	
  consectetur	
  adipiscing	
  elit.	
  Mauris	
  
         vehicula	
  ves;bulum	
  dictum.	
  Aenean	
  non	
  velit	
  tortor.	
  Nullam	
  adipiscing	
  
         malesuada	
  aliquam.	
  Mauris	
  dignissim,	
  urna	
  quis	
  iaculis	
  tempus,	
  justo	
  
layout   libero	
  por6tor	
  est,	
  nec	
  eleifend	
  est	
  elit	
  vitae	
  ante.	
  Curabitur	
  interdum	
  
         luctus	
  metus,	
  in	
  pulvinar	
  lectus	
  rutrum	
  sit	
  amet.	
  Duis	
  gravida,	
  metus	
  in	
  
         dictum	
  eleifend,	
  dolor	
  risus	
  ;ncidunt	
  ligula,	
  non	
  volutpat	
  nulla	
  sapien	
  in	
  
         elit.	
  Nulla	
  rutrum	
  erat	
  id	
  neque	
  suscipit	
  eu	
  ultricies	
  odio	
  sollicitudin.	
  
         Aliquam	
  a	
  mi	
  vel	
  eros	
  placerat	
  hendrerit.	
  Phasellus	
  por6tor,	
  augue	
  sit	
  
         amet	
  vulputate	
  venena;s,	
  dui	
  leo	
  commodo	
  odio,	
  a	
  euismod	
  turpis	
  
         ligula	
  in	
  elit.	
  	
  


                                                                                                                    slot
{% extends "HelloBundle::layout" %}

{% block content %}
    Hello {{ name }}!
{% endblock %}
<html>
    <head>
        <title>
           {% block title %}{% endblock %}
        </title>
    </head>
    <body>
        {% block body %}{% endblock %}
    </body>
</html>
Routing
/blog.php?section=symfony&article_id=18475
web/
  index.php
/index.php/blog/2010/08/21/symfony2-meets-phpBB4
/blog/2010/08/21/symfony2-meets-phpBB4
/blog/:year/:month/:day/:slug
post:
    pattern: /blog/:year/:month/:day/:slug
    defaults:
      { _controller: BlogBundle:Post:show }
<routes>
    <route
      id="post"
      pattern="/blog/:year/:month/:day/:slug">
      <default key="_controller">
         BlogBundle:Post:show
      </default>
    </route>
</routes>
use SymfonyComponentRoutingRouteCollection;
use SymfonyComponentRoutingRoute;

$collection = new RouteCollection();

$route = new Route(
  '/blog/:year/:month/:day/:slug',
  array('_controller' => 'BlogBundle:Post:show'));

$collection->addRoute('post', $route);

return $collection;
$router
  ->match('/blog/2010/08/21/sf2-meets-phpBB4')



$router
  ->generate('post', array('slug' => '...'))
post:
    pattern: /post/:slug
    defaults:
      { _controller: BlogBundle:Post:show }
$router
  ->generate('post', array('slug' => '...'))
Bundles
.../
  SomeBundle/
     Controller/
     Entity/
     Resources/
       config/
       views/
     SomeBundle.php
     Tests/
public function registerBundleDirs()
{
  return array(
     'Application'    => __DIR__.'/../src/Application',
     'Bundle'         => __DIR__.'/../src/Bundle',
     'SymfonyBundle' => __DIR__.'/../src/vendor/symfony/
src/Symfony/Bundle',
  );
}
$this->render('SomeBundle:Hello:index', $params)
hello:
  pattern: /hello/:name
  defaults: { _controller: SomeBundle:... }
SomeBundle can be any of


ApplicationSomeBundle
BundleSomeBundle
SymfonyBundleSomeBundle
Environments
Developers     Customer     End Users




Development     Staging      Production
Environment   Environment   Environment
cache         cache          cache

  debug	
       debug	
        debug	
  

   logs	
        logs	
         logs	
  

    stats        stats          stats



Development     Staging      Production
Environment   Environment   Environment
# config/config.yml
doctrine.dbal:
    dbname:    mydbname
    user:      root
    password: %doctrine.dbal_password%

swift.mailer:
    transport:   smtp
    host:        localhost
# config/config_dev.yml
imports:
    - { resource: config.yml }

zend.logger:
    priority: debug
    path:     %kernel.root_dir%/logs/%kernel.environment%.log


doctrine.dbal:
    password: ~

swift.mailer:
    transport:      gmail
    username:       xxxxxxxx
    password:       xxxxxxxx
# Doctrine Configuration
doctrine.dbal:
    dbname:    xxxxxxxx
    user:      xxxxxxxx
    password: ~

# Swiftmailer Configuration
swift.mailer:
    transport: smtp
    encryption: ssl
    auth_mode: login
    host:       smtp.gmail.com
    username:   xxxxxxxx
    password:   xxxxxxxx
<!-- Doctrine Configuration -->
<doctrine:dbal dbname="xxxxxxxx" user="xxxxxxxx"
password="" />
<doctrine:orm />

<!-- Swiftmailer Configuration -->
<swift:mailer
    transport="smtp"
    encryption="ssl"
    auth_mode="login"
    host="smtp.gmail.com"
    username="xxxxxxxx"
    password="xxxxxxxx" />
// Doctrine Configuration
$container->loadFromExtension('doctrine', 'dbal', array(
    'dbname'   => 'xxxxxxxx',
    'user'     => 'xxxxxxxx',
    'password' => '',
));
$container->loadFromExtension('doctrine', 'orm');

// Swiftmailer Configuration
$container->loadFromExtension('swift', 'mailer', array(
    'transport' => "smtp",
    'encryption' => "ssl",
    'auth_mode' => "login",
    'host'       => "smtp.gmail.com",
    'username'   => "xxxxxxxx",
    'password'   => "xxxxxxxx",
));
Developer Tools
INFO: Matched route "blog_home" (parameters: array ( '_bundle' =>
'BlogBundle', '_controller' => 'Post', '_action' => 'index', '_route' =>
'blog_home',))

INFO: Using controller "BundleBlogBundleController
PostController::indexAction"

INFO: SELECT s0_.id AS id0, s0_.title AS title1, s0_.html_body AS html_body2,
s0_.excerpt AS excerpt3, s0_.published_at AS published_at4 FROM sf_weblog_post
s0_ ORDER BY s0_.published_at DESC LIMIT 10 (array ())
INFO: Matched route "blog_post" (parameters: array ( '_bundle' =>
'BlogBundle', '_controller' => 'Post', '_action' => 'show', '_format' =>
'html', 'id' => '3456', '_route' => 'blog_post',))

INFO: Using controller "BundleBlogBundleController
PostController::showAction »

INFO: SELECT s0_.id AS id0, s0_.title AS title1, s0_.html_body AS html_body2,
s0_.excerpt AS excerpt3, s0_.published_at AS published_at4 FROM sf_weblog_post
s0_ WHERE s0_.id = ? (array ( 0 => '3456',))
ERR: Post "3456" not found! (No result was found for query although at least
one row was expected.) (uncaught SymfonyComponentsRequestHandlerException
NotFoundHttpException exception)

INFO: Using controller "SymfonyFrameworkWebBundleController
ExceptionController::exceptionAction"
DEBUG: Notifying (until) event "core.request" to listener "(SymfonyFrameworkWebBundleListenerRequestParser, resolve)"
INFO: Matched route "blog_post" (parameters: array ( '_bundle' => 'BlogBundle', '_controller' => 'Post', '_action' => 'show',
'_format' => 'html', 'id' => '3456', '_route' => 'blog_post',))
DEBUG: Notifying (until) event "core.load_controller" to listener "(SymfonyFrameworkWebBundleListenerControllerLoader,
resolve)"
INFO: Using controller "BundleBlogBundleControllerPostController::showAction"
DEBUG: Listener "(SymfonyFrameworkWebBundleListenerControllerLoader, resolve)" processed the event "core.load_controller"
INFO: Trying to get post "3456" from database
INFO: SELECT s0_.id AS id0, s0_.title AS title1, s0_.html_body AS html_body2, s0_.excerpt AS excerpt3, s0_.published_at AS
published_at4 FROM sf_weblog_post s0_ WHERE s0_.id = ? (array ( 0 => '3456',))
DEBUG: Notifying (until) event "core.exception" to listener "(SymfonyFrameworkWebBundleListenerExceptionHandler, handle)"
ERR: Post "3456" not found! (No result was found for query although at least one row was expected.) (uncaught SymfonyComponents
RequestHandlerExceptionNotFoundHttpException exception)
DEBUG: Notifying (until) event "core.request" to listener "(SymfonyFrameworkWebBundleListenerRequestParser, resolve)"
DEBUG: Notifying (until) event "core.load_controller" to listener "(SymfonyFrameworkWebBundleListenerControllerLoader,
resolve)"
INFO: Using controller "SymfonyFrameworkWebBundleControllerExceptionController::exceptionAction"
DEBUG: Listener "(SymfonyFrameworkWebBundleListenerControllerLoader, resolve)" processed the event "core.load_controller"
DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleListenerResponseFilter, filter)"
DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleDebugDataCollector
DataCollectorManager, handle)"
DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleDebugWebDebugToolbar, handle)"
DEBUG: Listener "(SymfonyFrameworkWebBundleListenerExceptionHandler, handle)" processed the event "core.exception"
DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleListenerResponseFilter, filter)"
DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleDebugDataCollector
DataCollectorManager, handle)"
DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleDebugWebDebugToolbar, handle)"
PhpBB meets Symfony2
PhpBB meets Symfony2
Security
XSS / CSRF / SQL Injection
<doctrine:dbal
   dbname="sfweb"
   username="root"
   password="SuperSecretPasswordThatAnyoneCanSee"
/>
in a .htaccess or httpd.conf file
SetEnv SYMFONY__DOCTRINE__DBAL__PASSWORD "foobar"
                        %doctrine.dbal.password%
<doctrine:dbal
   dbname="sfweb"
   username="root"
   password="%doctrine.dbal.password%"
/>
Functional Tests
$client = $this->createClient();

$crawler = $client->request(
  'GET', '/hello/Fabien');

$this->assertTrue($crawler->filter(
  'html:contains("Hello Fabien")')->count());
$this->assertEquals(
  10,
  $crawler->filter('div.hentry')->count());

$this->assertTrue(
  $client->getResponse()->isSuccessful());
$crawler = $client->request(
   'GET', 'hello/Lucas'
);
$link = $crawler->selectLink("Greet Lucas");

$client->click($link);
$form = $crawler->selectButton('submit');

$client->submit($form, array(
    'name'         => 'Lucas',
    'country'      => 'France',
    'like_symfony' => true,
    'photo'        => '/path/to/lucas.jpg',
));
$harry = $this->createClient();
$sally = $this->createClient();

$harry->request('POST', '/say/sally/Hello');
$sally->request('GET', '/messages');

$this->assertEquals(201,
  $harry->getResponse()->getStatusCode());

$this->assertRegExp('/Hello/',
  $sally->getResponse()->getContent());
$harry = $this->createClient();
$sally = $this->createClient();

$harry->insulate();
$sally->insulate();

$harry->request('POST', '/say/sally/Hello');
$sally->request('GET', '/messages');

$this->assertEquals(201,
  $harry->getResponse()->getStatusCode());
$this->assertRegExp('/Hello/',
  $sally->getResponse()->getContent());
Caching
cacheable for 10 seconds
                                                                            cacheable for 5 seconds
         Lorem	
  ipsum	
  dolor	
  sit	
  amet,	
  consectetur	
           Lorem	
  ipsum	
  dolor	
  sit	
  
layout   adipiscing	
  elit.	
  In	
  vel	
  nulla	
  arcu,	
  vitae	
      amet,	
  consectetur	
  
         cursus	
  nunc.	
  Integer	
  semper	
  turpis	
  et	
  enim	
     adipiscing	
  elit.	
  In	
  vel	
  nulla	
  
         por6tor	
  iaculis.	
  Nulla	
  facilisi.	
  Lorem	
  ipsum	
      arcu,	
  vitae	
  cursus	
  nunc.	
  
         dolor	
  sit	
  amet,	
  consectetur	
  adipiscing	
  elit.	
      Integer	
  semper	
  turpis	
  et	
  
         Mauris	
  vehicula	
  ves;bulum	
  dictum.	
                       enim	
  por6tor	
  iaculis.	
  
         Aenean	
  non	
  velit	
  tortor.	
  Nullam	
  adipiscing	
        Nulla	
  facilisi.	
  Lorem	
  ipsum	
  
         malesuada	
  aliquam.	
  Mauris	
  dignissim,	
  urna	
            dolor	
  sit	
  amet,	
  
         quis	
  iaculis	
  tempus,	
  justo	
  libero	
  por6tor	
         consectetur	
  adipiscing	
  elit.	
  
         est,	
  nec	
  eleifend	
  est	
  elit	
  vitae	
  ante.	
         Mauris	
  vehicula	
  
         Curabitur	
  interdum	
  luctus	
  metus,	
  in	
                  ves;bulum	
  dictum.	
  
         pulvinar	
  lectus	
  rutrum	
  sit	
  amet.	
  Duis	
             Aenean	
  non	
  velit	
  tortor.	
  
         gravida,	
  metus	
  in	
  dictum	
  eleifend,	
  dolor	
          Nullam	
  adipiscing	
  
         risus	
  ;ncidunt	
  ligula,	
  non	
  volutpat	
  nulla	
         malesuada	
  aliquam.	
  
         sapien	
  main Nulla	
  rutrum	
  erat	
  id	
  neque	
  
                     in	
  elit.	
                                          Mauris	
  embeddedurna	
  
                                                                                       dignissim,	
  
         suscipit	
  eu	
  ultricies	
  odio	
  sollicitudin.	
  
                 controller                                                 quis	
  iaculis	
  tempus,	
  justo	
  
                                                                                        controller
         Aliquam	
  a	
  mi	
  vel	
  eros	
  placerat	
  hendrerit.	
      libero	
  por6tor	
  est,	
  nec	
  
         Phasellus	
  por6tor,	
  augue	
  sit	
  amet	
                    eleifend	
  est	
  elit	
  vitae	
  ante.	
  
         vulputate	
  venena;s,	
  dui	
  leo	
  commodo	
                  Curabitur	
  interdum	
  luctus	
  
         odio,	
  a	
  euismod	
  turpis	
  ligula	
  in	
  elit.	
  	
     metus.	
  
cacheable for 10 seconds

<?php $view->extend('...:layout') ?>

<?php $view['slots']->start('sidebar') ?> 5 seconds
                                 cacheable for
<?php echo $view['actions']->render('...:list') ?>

<?php $view['slots']->stop() ?>
$view['actions']->render('...:list', array(
   'standalone' => true,
))
Lorem	
  ipsum	
  dolor	
  sit	
  amet,	
  consectetur	
              Lorem	
  ipsum	
  dolor	
  sit	
  
adipiscing	
  elit.	
  In	
  vel	
  nulla	
  arcu,	
  vitae	
         amet,	
  consectetur	
  
cursus	
  nunc.	
  Integer	
  semper	
  turpis	
  et	
  enim	
        adipiscing	
  elit.	
  In	
  vel	
  nulla	
  
por6tor	
  iaculis.	
  Nulla	
  facilisi.	
  Lorem	
  ipsum	
         arcu,	
  vitae	
  cursus	
  nunc.	
  
dolor	
  sit	
  amet,	
  consectetur	
  adipiscing	
  elit.	
         Integer	
  semper	
  turpis	
  et	
  
Mauris	
  vehicula	
  ves;bulum	
  dictum.	
                          enim	
  por6tor	
  iaculis.	
  
Aenean	
  non	
  velit	
  tortor.	
  Nullam	
  adipiscing	
           Nulla	
  facilisi.	
  Lorem	
  ipsum	
  
malesuada	
  aliquam.	
  Mauris	
  dignissim,	
  urna	
               dolor	
  sit	
  amet,	
  
quis	
  iaculis	
  tempus,	
  justo	
  libero	
  por6tor	
            consectetur	
  adipiscing	
  elit.	
  
est,	
  nec	
  eleifend	
  est	
  elit	
  vitae	
  ante.	
            Mauris	
  vehicula	
  
Curabitur	
  interdum	
  luctus	
  metus,	
  in	
                     ves;bulum	
  dictum.	
  
pulvinar	
  lectus	
  rutrum	
  sit	
  amet.	
  Duis	
                Aenean	
  non	
  velit	
  tortor.	
  
gravida,	
  metus	
  in	
  dictum	
  eleifend,	
  dolor	
             Nullam	
  adipiscing	
  
risus	
  ;ncidunt	
  ligula,	
  non	
  volutpat	
  nulla	
            malesuada	
  aliquam.	
  
sapien	
  in	
  elit.	
  Nulla	
  rutrum	
  erat	
  id	
  neque	
     Mauris	
  dignissim,	
  urna	
  
suscipit	
  eu	
  ultricies	
  odio	
  sollicitudin.	
                quis	
  iaculis	
  tempus,	
  justo	
  
Aliquam	
  a	
  mi	
  vel	
  eros	
  placerat	
  hendrerit.	
         libero	
  por6tor	
  est,	
  nec	
  
Phasellus	
  por6tor,	
  augue	
  sit	
  amet	
                       eleifend	
  est	
  elit	
  vitae	
  ante.	
  
vulputate	
  venena;s,	
  dui	
  leo	
  commodo	
                     Curabitur	
  interdum	
  luctus	
  
odio,	
  a	
  euismod	
  turpis	
  ligula	
  in	
  elit.	
  	
        metus.	
  
<esi:include src="..." />
Lorem	
  ipsum	
  dolor	
  sit	
  amet,	
  consectetur	
  
adipiscing	
  elit.	
  In	
  vel	
  nulla	
  arcu,	
  vitae	
  
cursus	
  nunc.	
  Integer	
  semper	
  turpis	
  et	
  enim	
  
por6tor	
  iaculis.	
  Nulla	
  facilisi.	
  Lorem	
  ipsum	
  
dolor	
  sit	
  amet,	
  consectetur	
  adipiscing	
  elit.	
  
Mauris	
  vehicula	
  ves;bulum	
  dictum.	
  
Aenean	
  non	
  velit	
  tortor.	
  Nullam	
  adipiscing	
  
malesuada	
  aliquam.	
  Mauris	
  dignissim,	
  urna	
  
quis	
  iaculis	
  tempus,	
  justo	
  libero	
  por6tor	
  
est,	
  nec	
  eleifend	
  est	
  elit	
  vitae	
  ante.	
  
Curabitur	
  interdum	
  luctus	
  metus,	
  in	
  
pulvinar	
  lectus	
  rutrum	
  sit	
  amet.	
  Duis	
  
gravida,	
  metus	
  in	
  dictum	
  eleifend,	
  dolor	
  
risus	
  ;ncidunt	
  ligula,	
  non	
  volutpat	
  nulla	
  
sapien	
  in	
  elit.	
  Nulla	
  rutrum	
  erat	
  id	
  neque	
  
suscipit	
  eu	
  ultricies	
  odio	
  sollicitudin.	
  
Aliquam	
  a	
  mi	
  vel	
  eros	
  placerat	
  hendrerit.	
  
Phasellus	
  por6tor,	
  augue	
  sit	
  amet	
  
vulputate	
  venena;s,	
  dui	
  leo	
  commodo	
  
odio,	
  a	
  euismod	
  turpis	
  ligula	
  in	
  elit.	
  	
  
ESI… or Edge Side Includes
Lorem	
  ipsum	
  
                                                                      dolor	
  sit	
  
                                                                      amet,	
  	
  

         1
                                                                  2




                                                                                                       Symfony2 Application
                                                                                           Lorem	
  
                                                                                           ipsum	
  




                                                  Reverse Proxy
                                                                                           dolor	
  
Client




                                                                  3


             Lorem	
  ipsum	
     Lorem	
  
             dolor	
  sit	
       ipsum	
  
             amet,	
  	
          dolor	
  



                                              4
Web Server




                      Symfony2
                        app
Requests




           Response
Web Server

               Symfony2 HTTP proxy


                      Symfony2
                        app
Requests




           Response
Reverse proxy

                      Web Server




                      Symfony2
                        app
Requests




           Response
HttpKernel: The framework construction kit
namespace SymfonyComponentHttpKernel;
interface HttpKernelInterface
{
  const MASTER_REQUEST = 1;
  const SUB_REQUEST = 2;

    public function handle(
      Request $request = null,
      $type = self::MASTER_REQUEST,
      $raw = false);
}
Request


      core.request


           getController()


      core.controller


           getArguments()


      core.view


      core.response



Response
Request


      core.request


           getController()


      core.controller


           getArguments()


      core.view


      core.response



Response
Request


      core.request


           getController()


      core.controller
                             core.exception

           getArguments()


      core.view


      core.response



Response
SwiftmailerBundle     DoctrineBundle


                                 ZendBundle               ...


             FrameworkBundle     TwigBundle

Bundles

               Framework



Components
               HttpKernel      DependencyInjection      Console


                                    Routing           Templating


             HttpFoundation    Event Dispatcher           ...
MOD author
Theme author
Core Developer
End Users
Everybody
Questions?

More Related Content

PDF
Symfony2 - OSIDays 2010
PDF
The state of Symfony2 - SymfonyDay 2010
PDF
Symfony2 - WebExpo 2010
PDF
Dependency injection - phpday 2010
PDF
Unit and Functional Testing with Symfony2
PDF
Dependency injection in PHP 5.3/5.4
PDF
News of the Symfony2 World
PDF
Dependency Injection IPC 201
Symfony2 - OSIDays 2010
The state of Symfony2 - SymfonyDay 2010
Symfony2 - WebExpo 2010
Dependency injection - phpday 2010
Unit and Functional Testing with Symfony2
Dependency injection in PHP 5.3/5.4
News of the Symfony2 World
Dependency Injection IPC 201

What's hot (20)

PDF
Symfony 2.0 on PHP 5.3
PDF
Dependency Injection with PHP 5.3
PDF
Dependency injection-zendcon-2010
PDF
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
PDF
Advanced symfony Techniques
PPTX
Zero to SOLID
PPT
Corephpcomponentpresentation 1211425966721657-8
PPTX
Speed up your developments with Symfony2
PDF
The Origin of Lithium
PDF
Php tips-and-tricks4128
PDF
The Zen of Lithium
PDF
Doctrine MongoDB ODM (PDXPHP)
PDF
Introducing Assetic (NYPHP)
KEY
Lithium Best
ODP
Symfony2, creare bundle e valore per il cliente
PDF
PHP 5.3 and Lithium: the most rad php framework
PDF
Lithium: The Framework for People Who Hate Frameworks
PDF
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
PDF
Forget about Index.php and build you applications around HTTP - PHPers Cracow
KEY
Can't Miss Features of PHP 5.3 and 5.4
Symfony 2.0 on PHP 5.3
Dependency Injection with PHP 5.3
Dependency injection-zendcon-2010
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Advanced symfony Techniques
Zero to SOLID
Corephpcomponentpresentation 1211425966721657-8
Speed up your developments with Symfony2
The Origin of Lithium
Php tips-and-tricks4128
The Zen of Lithium
Doctrine MongoDB ODM (PDXPHP)
Introducing Assetic (NYPHP)
Lithium Best
Symfony2, creare bundle e valore per il cliente
PHP 5.3 and Lithium: the most rad php framework
Lithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Can't Miss Features of PHP 5.3 and 5.4
Ad

Viewers also liked (15)

PDF
Building a Pyramid: Symfony Testing Strategies
PDF
Dependency Injection - ConFoo 2010
PDF
Caching on the Edge with Symfony2
PDF
PHP 5.3 in practice
PDF
Look beyond PHP
PDF
Symfony Components
PDF
Testing and symfony2
PDF
You Shall Not Pass - Security in Symfony
PDF
Design patterns revisited with PHP 5.3
PDF
PDF
PhpUnit Best Practices
PPTX
TechLeads meetup: Евгений Потапов, ITSumma
PDF
TechLeads meetup: Макс Лапшин, Erlyvideo
PDF
TechLeads meetup: Алексей Рыбак, Badoo
PPTX
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
Building a Pyramid: Symfony Testing Strategies
Dependency Injection - ConFoo 2010
Caching on the Edge with Symfony2
PHP 5.3 in practice
Look beyond PHP
Symfony Components
Testing and symfony2
You Shall Not Pass - Security in Symfony
Design patterns revisited with PHP 5.3
PhpUnit Best Practices
TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
Ad

Similar to PhpBB meets Symfony2 (20)

PDF
Symfony2 - WebExpo 2010
PDF
Mojolicious
PDF
Symfony2 revealed
PDF
PHP SA 2014 - Releasing Your Open Source Project
KEY
Mojolicious - A new hope
PPTX
Flask – Python
PDF
Blog Hacks 2011
PDF
TYPO3 Extension development using new Extbase framework
PDF
Ch ch-changes cake php2
PDF
Build powerfull and smart web applications with Symfony2
PPT
Heavy Web Optimization: Backend
PDF
Mojolicious. Веб в коробке!
PDF
関西PHP勉強会 php5.4つまみぐい
ODP
CodeIgniter PHP MVC Framework
PDF
Mojolicious, real-time web framework
PPTX
Debugging in drupal 8
PDF
Curso Symfony - Clase 4
PDF
Rails 3: Dashing to the Finish
ODP
The why and how of moving to PHP 5.4/5.5
PDF
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Symfony2 - WebExpo 2010
Mojolicious
Symfony2 revealed
PHP SA 2014 - Releasing Your Open Source Project
Mojolicious - A new hope
Flask – Python
Blog Hacks 2011
TYPO3 Extension development using new Extbase framework
Ch ch-changes cake php2
Build powerfull and smart web applications with Symfony2
Heavy Web Optimization: Backend
Mojolicious. Веб в коробке!
関西PHP勉強会 php5.4つまみぐい
CodeIgniter PHP MVC Framework
Mojolicious, real-time web framework
Debugging in drupal 8
Curso Symfony - Clase 4
Rails 3: Dashing to the Finish
The why and how of moving to PHP 5.4/5.5
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010

More from Fabien Potencier (10)

PDF
Caching on the Edge
PDF
Dependency Injection
PDF
Dependency Injection with PHP and PHP 5.3
PDF
Symfony Components 2.0 on PHP 5.3
PDF
Playing With PHP 5.3
PDF
Symfony2 San Francisco Meetup 2009
PDF
Symfony And Zend Framework Together 2009
PDF
Twig, the flexible, fast, and secure template language for PHP
PDF
symfony: Un Framework Open-Source pour les Entreprises (Solutions Linux 2008)
PDF
The symfony platform: Create your very own framework (PHP Quebec 2008)
Caching on the Edge
Dependency Injection
Dependency Injection with PHP and PHP 5.3
Symfony Components 2.0 on PHP 5.3
Playing With PHP 5.3
Symfony2 San Francisco Meetup 2009
Symfony And Zend Framework Together 2009
Twig, the flexible, fast, and secure template language for PHP
symfony: Un Framework Open-Source pour les Entreprises (Solutions Linux 2008)
The symfony platform: Create your very own framework (PHP Quebec 2008)

Recently uploaded (20)

PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Electronic commerce courselecture one. Pdf
PPTX
MYSQL Presentation for SQL database connectivity
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
A comparative analysis of optical character recognition models for extracting...
PPTX
1. Introduction to Computer Programming.pptx
PPT
Teaching material agriculture food technology
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
cuic standard and advanced reporting.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PPTX
Machine Learning_overview_presentation.pptx
Advanced methodologies resolving dimensionality complications for autism neur...
SOPHOS-XG Firewall Administrator PPT.pptx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Spectral efficient network and resource selection model in 5G networks
Electronic commerce courselecture one. Pdf
MYSQL Presentation for SQL database connectivity
MIND Revenue Release Quarter 2 2025 Press Release
Machine learning based COVID-19 study performance prediction
Group 1 Presentation -Planning and Decision Making .pptx
Assigned Numbers - 2025 - Bluetooth® Document
A comparative analysis of optical character recognition models for extracting...
1. Introduction to Computer Programming.pptx
Teaching material agriculture food technology
Reach Out and Touch Someone: Haptics and Empathic Computing
cuic standard and advanced reporting.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Machine Learning_overview_presentation.pptx

PhpBB meets Symfony2

  • 1. phpBB4 meets Symfony2 Fabien Potencier
  • 2. symfony 1 vs Symfony2
  • 3. MVC
  • 4. namespace ApplicationHelloBundleController; use SymfonyBundleFrameworkBundleController; class HelloController extends Controller { public function indexAction($name) { // Get things from the Model return $this->render( 'HelloBundle:Hello:index', array('name' => $name) ); } }
  • 6. <html> <head> <title> <?php $view['slots']->output('title') ?> </title> </head> <body> <?php $view['slots']->output('_content') ?> </body> </html>
  • 7. title Lorem  ipsum  dolor  sit  amet,  consectetur  adipiscing  elit.  In  vel   _content Lorem  ipsum  dolor  sit  amet,  consectetur  adipiscing  elit.  In  vel  nulla  arcu,   vitae  cursus  nunc.  Integer  semper  turpis  et  enim  por6tor  iaculis.  Nulla   facilisi.  Lorem  ipsum  dolor  sit  amet,  consectetur  adipiscing  elit.  Mauris   vehicula  ves;bulum  dictum.  Aenean  non  velit  tortor.  Nullam  adipiscing   malesuada  aliquam.  Mauris  dignissim,  urna  quis  iaculis  tempus,  justo   layout libero  por6tor  est,  nec  eleifend  est  elit  vitae  ante.  Curabitur  interdum   luctus  metus,  in  pulvinar  lectus  rutrum  sit  amet.  Duis  gravida,  metus  in   dictum  eleifend,  dolor  risus  ;ncidunt  ligula,  non  volutpat  nulla  sapien  in   elit.  Nulla  rutrum  erat  id  neque  suscipit  eu  ultricies  odio  sollicitudin.   Aliquam  a  mi  vel  eros  placerat  hendrerit.  Phasellus  por6tor,  augue  sit   amet  vulputate  venena;s,  dui  leo  commodo  odio,  a  euismod  turpis   ligula  in  elit.     slot
  • 8. {% extends "HelloBundle::layout" %} {% block content %} Hello {{ name }}! {% endblock %}
  • 9. <html> <head> <title> {% block title %}{% endblock %} </title> </head> <body> {% block body %}{% endblock %} </body> </html>
  • 16. post: pattern: /blog/:year/:month/:day/:slug defaults: { _controller: BlogBundle:Post:show }
  • 17. <routes> <route id="post" pattern="/blog/:year/:month/:day/:slug"> <default key="_controller"> BlogBundle:Post:show </default> </route> </routes>
  • 18. use SymfonyComponentRoutingRouteCollection; use SymfonyComponentRoutingRoute; $collection = new RouteCollection(); $route = new Route( '/blog/:year/:month/:day/:slug', array('_controller' => 'BlogBundle:Post:show')); $collection->addRoute('post', $route); return $collection;
  • 19. $router ->match('/blog/2010/08/21/sf2-meets-phpBB4') $router ->generate('post', array('slug' => '...'))
  • 20. post: pattern: /post/:slug defaults: { _controller: BlogBundle:Post:show }
  • 21. $router ->generate('post', array('slug' => '...'))
  • 23. .../ SomeBundle/ Controller/ Entity/ Resources/ config/ views/ SomeBundle.php Tests/
  • 24. public function registerBundleDirs() { return array( 'Application' => __DIR__.'/../src/Application', 'Bundle' => __DIR__.'/../src/Bundle', 'SymfonyBundle' => __DIR__.'/../src/vendor/symfony/ src/Symfony/Bundle', ); }
  • 26. hello: pattern: /hello/:name defaults: { _controller: SomeBundle:... }
  • 27. SomeBundle can be any of ApplicationSomeBundle BundleSomeBundle SymfonyBundleSomeBundle
  • 29. Developers Customer End Users Development Staging Production Environment Environment Environment
  • 30. cache cache cache debug   debug   debug   logs   logs   logs   stats stats stats Development Staging Production Environment Environment Environment
  • 31. # config/config.yml doctrine.dbal: dbname: mydbname user: root password: %doctrine.dbal_password% swift.mailer: transport: smtp host: localhost
  • 32. # config/config_dev.yml imports: - { resource: config.yml } zend.logger: priority: debug path: %kernel.root_dir%/logs/%kernel.environment%.log doctrine.dbal: password: ~ swift.mailer: transport: gmail username: xxxxxxxx password: xxxxxxxx
  • 33. # Doctrine Configuration doctrine.dbal: dbname: xxxxxxxx user: xxxxxxxx password: ~ # Swiftmailer Configuration swift.mailer: transport: smtp encryption: ssl auth_mode: login host: smtp.gmail.com username: xxxxxxxx password: xxxxxxxx
  • 34. <!-- Doctrine Configuration --> <doctrine:dbal dbname="xxxxxxxx" user="xxxxxxxx" password="" /> <doctrine:orm /> <!-- Swiftmailer Configuration --> <swift:mailer transport="smtp" encryption="ssl" auth_mode="login" host="smtp.gmail.com" username="xxxxxxxx" password="xxxxxxxx" />
  • 35. // Doctrine Configuration $container->loadFromExtension('doctrine', 'dbal', array( 'dbname' => 'xxxxxxxx', 'user' => 'xxxxxxxx', 'password' => '', )); $container->loadFromExtension('doctrine', 'orm'); // Swiftmailer Configuration $container->loadFromExtension('swift', 'mailer', array( 'transport' => "smtp", 'encryption' => "ssl", 'auth_mode' => "login", 'host' => "smtp.gmail.com", 'username' => "xxxxxxxx", 'password' => "xxxxxxxx", ));
  • 37. INFO: Matched route "blog_home" (parameters: array ( '_bundle' => 'BlogBundle', '_controller' => 'Post', '_action' => 'index', '_route' => 'blog_home',)) INFO: Using controller "BundleBlogBundleController PostController::indexAction" INFO: SELECT s0_.id AS id0, s0_.title AS title1, s0_.html_body AS html_body2, s0_.excerpt AS excerpt3, s0_.published_at AS published_at4 FROM sf_weblog_post s0_ ORDER BY s0_.published_at DESC LIMIT 10 (array ())
  • 38. INFO: Matched route "blog_post" (parameters: array ( '_bundle' => 'BlogBundle', '_controller' => 'Post', '_action' => 'show', '_format' => 'html', 'id' => '3456', '_route' => 'blog_post',)) INFO: Using controller "BundleBlogBundleController PostController::showAction » INFO: SELECT s0_.id AS id0, s0_.title AS title1, s0_.html_body AS html_body2, s0_.excerpt AS excerpt3, s0_.published_at AS published_at4 FROM sf_weblog_post s0_ WHERE s0_.id = ? (array ( 0 => '3456',)) ERR: Post "3456" not found! (No result was found for query although at least one row was expected.) (uncaught SymfonyComponentsRequestHandlerException NotFoundHttpException exception) INFO: Using controller "SymfonyFrameworkWebBundleController ExceptionController::exceptionAction"
  • 39. DEBUG: Notifying (until) event "core.request" to listener "(SymfonyFrameworkWebBundleListenerRequestParser, resolve)" INFO: Matched route "blog_post" (parameters: array ( '_bundle' => 'BlogBundle', '_controller' => 'Post', '_action' => 'show', '_format' => 'html', 'id' => '3456', '_route' => 'blog_post',)) DEBUG: Notifying (until) event "core.load_controller" to listener "(SymfonyFrameworkWebBundleListenerControllerLoader, resolve)" INFO: Using controller "BundleBlogBundleControllerPostController::showAction" DEBUG: Listener "(SymfonyFrameworkWebBundleListenerControllerLoader, resolve)" processed the event "core.load_controller" INFO: Trying to get post "3456" from database INFO: SELECT s0_.id AS id0, s0_.title AS title1, s0_.html_body AS html_body2, s0_.excerpt AS excerpt3, s0_.published_at AS published_at4 FROM sf_weblog_post s0_ WHERE s0_.id = ? (array ( 0 => '3456',)) DEBUG: Notifying (until) event "core.exception" to listener "(SymfonyFrameworkWebBundleListenerExceptionHandler, handle)" ERR: Post "3456" not found! (No result was found for query although at least one row was expected.) (uncaught SymfonyComponents RequestHandlerExceptionNotFoundHttpException exception) DEBUG: Notifying (until) event "core.request" to listener "(SymfonyFrameworkWebBundleListenerRequestParser, resolve)" DEBUG: Notifying (until) event "core.load_controller" to listener "(SymfonyFrameworkWebBundleListenerControllerLoader, resolve)" INFO: Using controller "SymfonyFrameworkWebBundleControllerExceptionController::exceptionAction" DEBUG: Listener "(SymfonyFrameworkWebBundleListenerControllerLoader, resolve)" processed the event "core.load_controller" DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleListenerResponseFilter, filter)" DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleDebugDataCollector DataCollectorManager, handle)" DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleDebugWebDebugToolbar, handle)" DEBUG: Listener "(SymfonyFrameworkWebBundleListenerExceptionHandler, handle)" processed the event "core.exception" DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleListenerResponseFilter, filter)" DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleDebugDataCollector DataCollectorManager, handle)" DEBUG: Notifying (filter) event "core.response" to listener "(SymfonyFrameworkWebBundleDebugWebDebugToolbar, handle)"
  • 43. XSS / CSRF / SQL Injection
  • 44. <doctrine:dbal dbname="sfweb" username="root" password="SuperSecretPasswordThatAnyoneCanSee" />
  • 45. in a .htaccess or httpd.conf file SetEnv SYMFONY__DOCTRINE__DBAL__PASSWORD "foobar" %doctrine.dbal.password%
  • 46. <doctrine:dbal dbname="sfweb" username="root" password="%doctrine.dbal.password%" />
  • 48. $client = $this->createClient(); $crawler = $client->request( 'GET', '/hello/Fabien'); $this->assertTrue($crawler->filter( 'html:contains("Hello Fabien")')->count());
  • 49. $this->assertEquals( 10, $crawler->filter('div.hentry')->count()); $this->assertTrue( $client->getResponse()->isSuccessful());
  • 50. $crawler = $client->request( 'GET', 'hello/Lucas' );
  • 51. $link = $crawler->selectLink("Greet Lucas"); $client->click($link);
  • 52. $form = $crawler->selectButton('submit'); $client->submit($form, array( 'name' => 'Lucas', 'country' => 'France', 'like_symfony' => true, 'photo' => '/path/to/lucas.jpg', ));
  • 53. $harry = $this->createClient(); $sally = $this->createClient(); $harry->request('POST', '/say/sally/Hello'); $sally->request('GET', '/messages'); $this->assertEquals(201, $harry->getResponse()->getStatusCode()); $this->assertRegExp('/Hello/', $sally->getResponse()->getContent());
  • 54. $harry = $this->createClient(); $sally = $this->createClient(); $harry->insulate(); $sally->insulate(); $harry->request('POST', '/say/sally/Hello'); $sally->request('GET', '/messages'); $this->assertEquals(201, $harry->getResponse()->getStatusCode()); $this->assertRegExp('/Hello/', $sally->getResponse()->getContent());
  • 56. cacheable for 10 seconds cacheable for 5 seconds Lorem  ipsum  dolor  sit  amet,  consectetur   Lorem  ipsum  dolor  sit   layout adipiscing  elit.  In  vel  nulla  arcu,  vitae   amet,  consectetur   cursus  nunc.  Integer  semper  turpis  et  enim   adipiscing  elit.  In  vel  nulla   por6tor  iaculis.  Nulla  facilisi.  Lorem  ipsum   arcu,  vitae  cursus  nunc.   dolor  sit  amet,  consectetur  adipiscing  elit.   Integer  semper  turpis  et   Mauris  vehicula  ves;bulum  dictum.   enim  por6tor  iaculis.   Aenean  non  velit  tortor.  Nullam  adipiscing   Nulla  facilisi.  Lorem  ipsum   malesuada  aliquam.  Mauris  dignissim,  urna   dolor  sit  amet,   quis  iaculis  tempus,  justo  libero  por6tor   consectetur  adipiscing  elit.   est,  nec  eleifend  est  elit  vitae  ante.   Mauris  vehicula   Curabitur  interdum  luctus  metus,  in   ves;bulum  dictum.   pulvinar  lectus  rutrum  sit  amet.  Duis   Aenean  non  velit  tortor.   gravida,  metus  in  dictum  eleifend,  dolor   Nullam  adipiscing   risus  ;ncidunt  ligula,  non  volutpat  nulla   malesuada  aliquam.   sapien  main Nulla  rutrum  erat  id  neque   in  elit.   Mauris  embeddedurna   dignissim,   suscipit  eu  ultricies  odio  sollicitudin.   controller quis  iaculis  tempus,  justo   controller Aliquam  a  mi  vel  eros  placerat  hendrerit.   libero  por6tor  est,  nec   Phasellus  por6tor,  augue  sit  amet   eleifend  est  elit  vitae  ante.   vulputate  venena;s,  dui  leo  commodo   Curabitur  interdum  luctus   odio,  a  euismod  turpis  ligula  in  elit.     metus.  
  • 57. cacheable for 10 seconds <?php $view->extend('...:layout') ?> <?php $view['slots']->start('sidebar') ?> 5 seconds cacheable for <?php echo $view['actions']->render('...:list') ?> <?php $view['slots']->stop() ?>
  • 59. Lorem  ipsum  dolor  sit  amet,  consectetur   Lorem  ipsum  dolor  sit   adipiscing  elit.  In  vel  nulla  arcu,  vitae   amet,  consectetur   cursus  nunc.  Integer  semper  turpis  et  enim   adipiscing  elit.  In  vel  nulla   por6tor  iaculis.  Nulla  facilisi.  Lorem  ipsum   arcu,  vitae  cursus  nunc.   dolor  sit  amet,  consectetur  adipiscing  elit.   Integer  semper  turpis  et   Mauris  vehicula  ves;bulum  dictum.   enim  por6tor  iaculis.   Aenean  non  velit  tortor.  Nullam  adipiscing   Nulla  facilisi.  Lorem  ipsum   malesuada  aliquam.  Mauris  dignissim,  urna   dolor  sit  amet,   quis  iaculis  tempus,  justo  libero  por6tor   consectetur  adipiscing  elit.   est,  nec  eleifend  est  elit  vitae  ante.   Mauris  vehicula   Curabitur  interdum  luctus  metus,  in   ves;bulum  dictum.   pulvinar  lectus  rutrum  sit  amet.  Duis   Aenean  non  velit  tortor.   gravida,  metus  in  dictum  eleifend,  dolor   Nullam  adipiscing   risus  ;ncidunt  ligula,  non  volutpat  nulla   malesuada  aliquam.   sapien  in  elit.  Nulla  rutrum  erat  id  neque   Mauris  dignissim,  urna   suscipit  eu  ultricies  odio  sollicitudin.   quis  iaculis  tempus,  justo   Aliquam  a  mi  vel  eros  placerat  hendrerit.   libero  por6tor  est,  nec   Phasellus  por6tor,  augue  sit  amet   eleifend  est  elit  vitae  ante.   vulputate  venena;s,  dui  leo  commodo   Curabitur  interdum  luctus   odio,  a  euismod  turpis  ligula  in  elit.     metus.  
  • 60. <esi:include src="..." /> Lorem  ipsum  dolor  sit  amet,  consectetur   adipiscing  elit.  In  vel  nulla  arcu,  vitae   cursus  nunc.  Integer  semper  turpis  et  enim   por6tor  iaculis.  Nulla  facilisi.  Lorem  ipsum   dolor  sit  amet,  consectetur  adipiscing  elit.   Mauris  vehicula  ves;bulum  dictum.   Aenean  non  velit  tortor.  Nullam  adipiscing   malesuada  aliquam.  Mauris  dignissim,  urna   quis  iaculis  tempus,  justo  libero  por6tor   est,  nec  eleifend  est  elit  vitae  ante.   Curabitur  interdum  luctus  metus,  in   pulvinar  lectus  rutrum  sit  amet.  Duis   gravida,  metus  in  dictum  eleifend,  dolor   risus  ;ncidunt  ligula,  non  volutpat  nulla   sapien  in  elit.  Nulla  rutrum  erat  id  neque   suscipit  eu  ultricies  odio  sollicitudin.   Aliquam  a  mi  vel  eros  placerat  hendrerit.   Phasellus  por6tor,  augue  sit  amet   vulputate  venena;s,  dui  leo  commodo   odio,  a  euismod  turpis  ligula  in  elit.    
  • 61. ESI… or Edge Side Includes
  • 62. Lorem  ipsum   dolor  sit   amet,     1 2 Symfony2 Application Lorem   ipsum   Reverse Proxy dolor   Client 3 Lorem  ipsum   Lorem   dolor  sit   ipsum   amet,     dolor   4
  • 63. Web Server Symfony2 app Requests Response
  • 64. Web Server Symfony2 HTTP proxy Symfony2 app Requests Response
  • 65. Reverse proxy Web Server Symfony2 app Requests Response
  • 66. HttpKernel: The framework construction kit
  • 67. namespace SymfonyComponentHttpKernel; interface HttpKernelInterface { const MASTER_REQUEST = 1; const SUB_REQUEST = 2; public function handle( Request $request = null, $type = self::MASTER_REQUEST, $raw = false); }
  • 68. Request core.request getController() core.controller getArguments() core.view core.response Response
  • 69. Request core.request getController() core.controller getArguments() core.view core.response Response
  • 70. Request core.request getController() core.controller core.exception getArguments() core.view core.response Response
  • 71. SwiftmailerBundle DoctrineBundle ZendBundle ... FrameworkBundle TwigBundle Bundles Framework Components HttpKernel DependencyInjection Console Routing Templating HttpFoundation Event Dispatcher ...