SlideShare a Scribd company logo
1 of 72
Download to read offline
¿Quién soy?


          Raúl Fraile

           @raulfraile

PHP/Symfony2 freelance developer
¿Qué hago?
SensioLabsConnect
¿Por qué?
app[_dev].php




Controlador frontal
app[_dev].php

// web/app[_env].php

1. require_once __DIR__.'/../app/bootstrap.php.cache';
2. require_once __DIR__.'/../app/AppKernel.php';

3. use SymfonyComponentHttpFoundationRequest;

4. $kernel = new AppKernel('dev', true);
5. $kernel->loadClassCache();
6. $kernel->handle(Request::createFromGlobals())->send();
bootstrap.php.cache



Clases/namespaces en
  un único fichero.
bootstrap.php.cache
// app/bootstrap.php.cache

namespace { require_once __DIR__.'/autoload.php'; }

namespace SymfonyComponentDependencyInjection
{
  interface ContainerAwareInterface
  {
          function setContainer(ContainerInterface $container = null);
    }
    ...
}
bootstrap.php.cache




Reduce operaciones I/O
bootstrap.php.cache




Carga autoload.php
autoload.php
// app/autoload.php

use SymfonyComponentClassLoaderUniversalClassLoader;

$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    'Symfony' => array(
       __DIR__.'/../vendor/symfony/src',
       __DIR__.'/../vendor/bundles'),
    'Assetic' => __DIR__.'/../vendor/assetic/src',
));
$loader->registerPrefixes(array(
    'Twig_' => __DIR__.'/../vendor/twig/lib',
));
ClassLoader


   Autoload de
clases/interfaces en
     Symfony2
ClassLoader
ClassLoader




Implementa PSR-0
PSR-0

Aprobado por el “Framework Interop Group”




github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
PSR-0

Fully Qualified Name
                   SymfonyCoreRequest
                     ZendMailMessage


             [vendor_path]/Symfony/Core/Request.php
               [vendor_path]/Zend/Mail/Message.php


    Filesystem
ClassLoader
// namespaced class name
$namespace = substr($class, 0, $pos);
foreach ($this->namespaces as $ns => $dirs) {
   if (0 !== strpos($namespace, $ns)) {
       continue;
   }
    foreach ($dirs as $dir) {
       $className = substr($class, $pos + 1);
       $file = $dir . DIR_SEPARATOR .
           str_replace('',DIR_SEPARATOR, $namespace) .
           DIR_SEPARATOR .
           str_replace('_', DIR_SEPARATOR, $className) . '.php';
       if (file_exists($file)) {
           return $file;
       }
    }
}
ClassLoader

 $loader->findFile(
    'SymfonyComponentHttpFoundationRequest'
 );




/Sites/desymfony/app/../vendor/symfony/src/
   Symfony/Component/HttpFoundation/Request.php
app[_dev].php

// web/app[_env].php

1. require_once __DIR__.'/../app/bootstrap.php.cache';
2. require_once __DIR__.'/../app/AppKernel.php';

3. use SymfonyComponentHttpFoundationRequest;

4. $kernel = new AppKernel('dev', true);
5. $kernel->loadClassCache();
6. $kernel->handle(Request::createFromGlobals())->send();
AppKernel.php
// src/AppKernel.php

use SymfonyComponentHttpKernelKernel;
use SymfonyComponentConfigLoaderLoaderInterface;

class AppKernel extends Kernel
{
   public function registerBundles()
   {
     $bundles = array(
        new SymfonyBundleTwigBundleTwigBundle(),
        ...
     );
     return $bundles;
   }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
      $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}
app[_dev].php

// web/app[_env].php

1. require_once __DIR__.'/../app/bootstrap.php.cache';
2. require_once __DIR__.'/../app/AppKernel.php';

3. use SymfonyComponentHttpFoundationRequest;

4. $kernel = new AppKernel('dev', true);
5. $kernel->loadClassCache();
6. $kernel->handle(Request::createFromGlobals())->send();

                                          Debug
                                  Environment
AppKernel.php
If (true === $debug) {
       Guarda inicio petición (microtime)
       display_errors = 1
       error_reporting = -1
       DebugUniversalClassLoader
} else {
       display_errors = 0
}
app[_dev].php

// web/app[_env].php

1. require_once __DIR__.'/../app/bootstrap.php.cache';
2. require_once __DIR__.'/../app/AppKernel.php';

3. use SymfonyComponentHttpFoundationRequest;

4. $kernel = new AppKernel('dev', true);
5. $kernel->loadClassCache();
6. $kernel->handle(Request::createFromGlobals())->send();
LoadClassCache


Objetivo: mapear FQN y
paths de las principales
   clases/interfaces
LoadClassCache


  Se cachea en
 classes.map y
classes.php.meta
app[_dev].php

// web/app[_env].php

1. require_once __DIR__.'/../app/bootstrap.php.cache';
2. require_once __DIR__.'/../app/AppKernel.php';

3. use SymfonyComponentHttpFoundationRequest;

4. $kernel = new AppKernel('dev', true);
5. $kernel->loadClassCache();
6. $kernel->handle(Request::createFromGlobals())->send();
Request



 Componente
HttpFoundation
Request



Abstracción OO de
una petición HTTP
Request


                                          Request
GET /index.php HTTP/1.1␍␊
Host: test.com␍␊              $_GET
                                           query
Accept-Language:en;q=0.8␍␊
                                          request
Accept-Encoding:gzip␍␊        $_POST
                                          cookies
User-Agent: Mozilla/5.0␍␊
␍␊                                          files
                             $_COOKIE
                                           server
                                          headers
                              $_FILES
                                          getHost
                             $_SERVER
                                         getClientIp
                                             ...
app[_dev].php

// web/app[_env].php

1. require_once __DIR__.'/../app/bootstrap.php.cache';
2. require_once __DIR__.'/../app/AppKernel.php';

3. use SymfonyComponentHttpFoundationRequest;

4. $kernel = new AppKernel('dev', true);
5. $kernel->loadClassCache();
6. $kernel->handle(Request::createFromGlobals())->send();
HttpKernel




Corazón de Symfony
HttpKernel


  Gestiona entorno
formado por bundles,
       DIC...
$kernel->boot()



Inicialización de
 bundles y DIC
$kernel->initializeBundles()


  Se cargan los bundles
       definidos en
AppKernel::registerBundles()
$kernel->initializeContainer()


   Se genera usando el
   ContainerBuilder del
  DependencyInjection
ContainerBuilder

// example.com/src/container.php
use SymfonyComponentDependencyInjection;
use SymfonyComponentDependencyInjectionReference;

$sc = new DependencyInjectionContainerBuilder();
$sc->register('context', 'SymfonyComponentRoutingRequestContext');
$sc->register('matcher', 'SymfonyComponentRoutingMatcherUrlMatcher')
   ->setArguments(array($routes, new Reference('context')));

$sc->register('framework', 'SimplexFramework')
   ->setArguments(array(new Reference('dispatcher'), new
Reference('resolver'))) ;
 http://fabien.potencier.org/article/62/create-your-own-framework-on-top-of-the-symfony2-components-part-12
$kernel->initializeContainer()



  {rootDir}{Environment}
 [Debug]ProjectContainer
$kernel->initializeContainer()


Por cada bundle se ejecuta
    Bundle::build() y se
registran sus extensiones
$kernel->boot()


Por cada bundle se asigna
el 'container' y se ejecuta
         el boot()
$kernel->handle()



Objetivo: Devolver un
  objeto Response
Evento kernel.request



Se lanza en cuanto
 llega la petición
Evento kernel.request


   Un listener puede
devolver un Response
y 'finalizar' la ejecución
Evento kernel.request


FrameworkBundle lo
utiliza para rellenar el
 valor de _controller
RouterListener


Utiliza un RouterMatcher
(autogenerado por comp.
       Routing)
RouterListener
// app/cache/dev/appdevUrlMatcher.php

class appdevUrlMatcher extends RedirectableUrlMatcher
{
   ...
   public function match($pathinfo)
   {
       ...
       // _demo_hello
       if (0 === strpos($pathinfo, '/demo/hello') &&
           preg_match('#^/demo/hello/(?P<name>[^/]+?)$#s', $pathinfo, $m)) {
           return array_merge($this->mergeDefaults($m, array(
            '_controller' => 'AcmeDemoBundleControllerDemoController::helloAction')
            ), array( '_route' => '_demo_hello'));
      }
      ...
  }
ControllerResolver


Encargado de devolver un
controlador + argumentos
 a partir de _controller
FrameworkBundle


Agrupa componentes y
librerías para crear un
  framework MVC
FrameworkBundle




Además, ofrece...
FrameworkBundle




php app/console
FrameworkBundle
// app/console

#!/usr/bin/env php
<?php

require_once __DIR__.'/bootstrap.php.cache';
require_once __DIR__.'/AppKernel.php';

use SymfonyBundleFrameworkBundleConsoleApplication;
use SymfonyComponentConsoleInputArgvInput;

$input = new ArgvInput();
$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');
$debug = !$input->hasParameterOption(array('--no-debug', ''));

$kernel = new AppKernel($env, $debug);
$application = new Application($kernel);
$application->run();
FrameworkBundle

Comandos
   assets:install
    cache:clear
  cache:warmup
 container:debug
router:dump-apache
   router:debug
FrameworkBundle




Controller
FrameworkBundle

// src/Acme/DemoBundle/Controller/DemoController

namespace AcmeDemoBundleController;

use SymfonyBundleFrameworkBundleControllerController;

class DemoController extends Controller
{
   public function helloAction($name)
   {
      ...
   }
}
FrameworkBundle


Y mucho más: ESI,
  WebTestCase,
DataCollectors...
Evento kernel.controller


  Una vez definido el
controlador, se lanza el
         evento
Evento kernel.controller



 Se puede cambiar,
pasando un Callable
Evento kernel.view


Se lanza si el Controller
no devuelve un objeto
       Response
Evento kernel.view


Objetivo: construir un
objeto Response del
return del Controller
Evento kernel.response


Permite reemplazar o
 modificar el objeto
     Response
Evento kernel.exception


   Oportunidad para
convertir una Exception
   en un Response
Eventos

       Todos heredan de
               KernelEvent
getRequestType(): MASTER_REQUEST o SUB_REQUEST
getKernel();
getRequest();
Response

Response
              HTTP/1.1 200 OK
 Headers      Content-type: text/html
              Date:Thu, 31 May 2012 17:54:50 GMT
 Version

 Content      <!DOCTYPE HTML>
              <html lang="es">
                <head>
Status code
                  <meta charset="utf-8">
                  ...
Status text

 Charset
app[_dev].php

// web/app[_env].php

1. require_once __DIR__.'/../app/bootstrap.php.cache';
2. require_once __DIR__.'/../app/AppKernel.php';

3. use SymfonyComponentHttpFoundationRequest;

4. $kernel = new AppKernel('dev', true);
5. $kernel->loadClassCache();
6. $kernel->handle(Request::createFromGlobals())->send();
Response::send()



Envía las cabeceras y el
      contenido
Response::send()
Demo



https://github.com/raulfraile/
  internals-desymfony2012
¡Gracias!
Fotografías


http://www.flickr.com/photos/connectirmeli/7233514862

 http://www.flickr.com/photos/barretthall/6070677596

http://www.flickr.com/photos/f-oxymoron/5005673112/
¿Preguntas?

More Related Content

What's hot

Adi Fatol - Ce e nou in PHP 5.3?
Adi Fatol - Ce e nou in PHP 5.3?Adi Fatol - Ce e nou in PHP 5.3?
Adi Fatol - Ce e nou in PHP 5.3?phpGeekMeet_ro
 
Simular un next del recordset en php de forma rudimentaria
Simular un next del recordset en php de forma rudimentariaSimular un next del recordset en php de forma rudimentaria
Simular un next del recordset en php de forma rudimentariajbersosa
 
Introduction to Service Worker
Introduction to Service WorkerIntroduction to Service Worker
Introduction to Service WorkerShogo Sensui
 
Twig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasTwig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasJavier Eguiluz
 

What's hot (6)

es6.concurrency()
es6.concurrency()es6.concurrency()
es6.concurrency()
 
Adi Fatol - Ce e nou in PHP 5.3?
Adi Fatol - Ce e nou in PHP 5.3?Adi Fatol - Ce e nou in PHP 5.3?
Adi Fatol - Ce e nou in PHP 5.3?
 
Simular un next del recordset en php de forma rudimentaria
Simular un next del recordset en php de forma rudimentariaSimular un next del recordset en php de forma rudimentaria
Simular un next del recordset en php de forma rudimentaria
 
Introduction to Service Worker
Introduction to Service WorkerIntroduction to Service Worker
Introduction to Service Worker
 
Testování prakticky
Testování praktickyTestování prakticky
Testování prakticky
 
Twig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasTwig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadas
 

Viewers also liked

Assetic (Symfony Live Paris)
Assetic (Symfony Live Paris)Assetic (Symfony Live Paris)
Assetic (Symfony Live Paris)Kris Wallsmith
 
Dependency Resolution with SAT [Symfony Live 2011 Paris]
Dependency Resolution with SAT [Symfony Live 2011 Paris]Dependency Resolution with SAT [Symfony Live 2011 Paris]
Dependency Resolution with SAT [Symfony Live 2011 Paris]Nils Adermann
 
Composer - Panada Conference 2014
Composer - Panada Conference 2014Composer - Panada Conference 2014
Composer - Panada Conference 2014Mulia Nasution
 
How kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonHow kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonKris Wallsmith
 

Viewers also liked (6)

Assetic (Zendcon)
Assetic (Zendcon)Assetic (Zendcon)
Assetic (Zendcon)
 
Assetic (OSCON)
Assetic (OSCON)Assetic (OSCON)
Assetic (OSCON)
 
Assetic (Symfony Live Paris)
Assetic (Symfony Live Paris)Assetic (Symfony Live Paris)
Assetic (Symfony Live Paris)
 
Dependency Resolution with SAT [Symfony Live 2011 Paris]
Dependency Resolution with SAT [Symfony Live 2011 Paris]Dependency Resolution with SAT [Symfony Live 2011 Paris]
Dependency Resolution with SAT [Symfony Live 2011 Paris]
 
Composer - Panada Conference 2014
Composer - Panada Conference 2014Composer - Panada Conference 2014
Composer - Panada Conference 2014
 
How kris-writes-symfony-apps-london
How kris-writes-symfony-apps-londonHow kris-writes-symfony-apps-london
How kris-writes-symfony-apps-london
 

More from Raul Fraile

Aplicaciones CLI profesionales con Symfony
Aplicaciones CLI profesionales con SymfonyAplicaciones CLI profesionales con Symfony
Aplicaciones CLI profesionales con SymfonyRaul Fraile
 
Steganography: Hiding your secrets with PHP
Steganography: Hiding your secrets with PHPSteganography: Hiding your secrets with PHP
Steganography: Hiding your secrets with PHPRaul Fraile
 
How GZIP compression works - JS Conf EU 2014
How GZIP compression works - JS Conf EU 2014How GZIP compression works - JS Conf EU 2014
How GZIP compression works - JS Conf EU 2014Raul Fraile
 
How GZIP works... in 10 minutes
How GZIP works... in 10 minutesHow GZIP works... in 10 minutes
How GZIP works... in 10 minutesRaul Fraile
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Raul Fraile
 
$kernel->infect(): Creating a cryptovirus for Symfony2 apps
$kernel->infect(): Creating a cryptovirus for Symfony2 apps$kernel->infect(): Creating a cryptovirus for Symfony2 apps
$kernel->infect(): Creating a cryptovirus for Symfony2 appsRaul Fraile
 
Materiales del curso de Symfony2
Materiales del curso de Symfony2Materiales del curso de Symfony2
Materiales del curso de Symfony2Raul Fraile
 
Sistemas de ficheros para dispositivos embebidos
Sistemas de ficheros para dispositivos embebidosSistemas de ficheros para dispositivos embebidos
Sistemas de ficheros para dispositivos embebidosRaul Fraile
 
Refactoring PHP/Symfony2 apps
Refactoring PHP/Symfony2 appsRefactoring PHP/Symfony2 apps
Refactoring PHP/Symfony2 appsRaul Fraile
 
Refactorización de aplicaciones PHP/Symfony2
Refactorización de aplicaciones PHP/Symfony2Refactorización de aplicaciones PHP/Symfony2
Refactorización de aplicaciones PHP/Symfony2Raul Fraile
 
MidwestPHP Symfony2 Internals
MidwestPHP Symfony2 InternalsMidwestPHP Symfony2 Internals
MidwestPHP Symfony2 InternalsRaul Fraile
 
Symfony internals [english]
Symfony internals [english]Symfony internals [english]
Symfony internals [english]Raul Fraile
 
Symfony2: Interacción con CSS, JS y HTML5
Symfony2: Interacción con CSS, JS y HTML5Symfony2: Interacción con CSS, JS y HTML5
Symfony2: Interacción con CSS, JS y HTML5Raul Fraile
 
Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoRaul Fraile
 
Symfony2: Framework para PHP5
Symfony2: Framework para PHP5Symfony2: Framework para PHP5
Symfony2: Framework para PHP5Raul Fraile
 
Symfony2: Framework para PHP5
Symfony2: Framework para PHP5Symfony2: Framework para PHP5
Symfony2: Framework para PHP5Raul Fraile
 
Presentacion Symfony2
Presentacion Symfony2Presentacion Symfony2
Presentacion Symfony2Raul Fraile
 

More from Raul Fraile (17)

Aplicaciones CLI profesionales con Symfony
Aplicaciones CLI profesionales con SymfonyAplicaciones CLI profesionales con Symfony
Aplicaciones CLI profesionales con Symfony
 
Steganography: Hiding your secrets with PHP
Steganography: Hiding your secrets with PHPSteganography: Hiding your secrets with PHP
Steganography: Hiding your secrets with PHP
 
How GZIP compression works - JS Conf EU 2014
How GZIP compression works - JS Conf EU 2014How GZIP compression works - JS Conf EU 2014
How GZIP compression works - JS Conf EU 2014
 
How GZIP works... in 10 minutes
How GZIP works... in 10 minutesHow GZIP works... in 10 minutes
How GZIP works... in 10 minutes
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain
 
$kernel->infect(): Creating a cryptovirus for Symfony2 apps
$kernel->infect(): Creating a cryptovirus for Symfony2 apps$kernel->infect(): Creating a cryptovirus for Symfony2 apps
$kernel->infect(): Creating a cryptovirus for Symfony2 apps
 
Materiales del curso de Symfony2
Materiales del curso de Symfony2Materiales del curso de Symfony2
Materiales del curso de Symfony2
 
Sistemas de ficheros para dispositivos embebidos
Sistemas de ficheros para dispositivos embebidosSistemas de ficheros para dispositivos embebidos
Sistemas de ficheros para dispositivos embebidos
 
Refactoring PHP/Symfony2 apps
Refactoring PHP/Symfony2 appsRefactoring PHP/Symfony2 apps
Refactoring PHP/Symfony2 apps
 
Refactorización de aplicaciones PHP/Symfony2
Refactorización de aplicaciones PHP/Symfony2Refactorización de aplicaciones PHP/Symfony2
Refactorización de aplicaciones PHP/Symfony2
 
MidwestPHP Symfony2 Internals
MidwestPHP Symfony2 InternalsMidwestPHP Symfony2 Internals
MidwestPHP Symfony2 Internals
 
Symfony internals [english]
Symfony internals [english]Symfony internals [english]
Symfony internals [english]
 
Symfony2: Interacción con CSS, JS y HTML5
Symfony2: Interacción con CSS, JS y HTML5Symfony2: Interacción con CSS, JS y HTML5
Symfony2: Interacción con CSS, JS y HTML5
 
Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimiento
 
Symfony2: Framework para PHP5
Symfony2: Framework para PHP5Symfony2: Framework para PHP5
Symfony2: Framework para PHP5
 
Symfony2: Framework para PHP5
Symfony2: Framework para PHP5Symfony2: Framework para PHP5
Symfony2: Framework para PHP5
 
Presentacion Symfony2
Presentacion Symfony2Presentacion Symfony2
Presentacion Symfony2
 

DeSymfony 2012: Symfony internals