Who am I?          Raúl Fraile           @raulfrailePHP/Symfony2 freelance developer
What do I do?
SensioLabsConnect
Why?
app[_dev].phpFront controller
app[_dev].php// web/app[_env].php1. require_once __DIR__./../app/bootstrap.php.cache;2. require_once __DIR__./../app/AppKe...
bootstrap.php.cacheSeveral classes/interfaces     in the same file
bootstrap.php.cache// app/bootstrap.php.cachenamespace { require_once __DIR__./autoload.php; }namespace SymfonyComponentDe...
bootstrap.php.cacheReduces I/O operations
bootstrap.php.cacheLoads autoload.php
autoload.php// app/autoload.phpuse SymfonyComponentClassLoaderUniversalClassLoader;$loader = new UniversalClassLoader();$l...
ClassLoader  Autoloading ofclasses/interfaces in     Symfony2
ClassLoader
ClassLoaderImplements PSR-0
PSR-0    Approved by the “Framework Interop                  Group”github.com/php-fig/fig-standards/blob/master/accepted/P...
PSR-0Fully Qualified Name                   SymfonyCoreRequest                     ZendMailMessage             [vendor_pat...
ClassLoader// namespaced class name$namespace = substr($class, 0, $pos);foreach ($this->namespaces as $ns => $dirs) {   if...
ClassLoader $loader->findFile(    SymfonyComponentHttpFoundationRequest );/Sites/desymfony/app/../vendor/symfony/src/   Sy...
app[_dev].php// web/app[_env].php1. require_once __DIR__./../app/bootstrap.php.cache;2. require_once __DIR__./../app/AppKe...
AppKernel.php// src/AppKernel.phpuse SymfonyComponentHttpKernelKernel;use SymfonyComponentConfigLoaderLoaderInterface;clas...
app[_dev].php// web/app[_env].php1. require_once __DIR__./../app/bootstrap.php.cache;2. require_once __DIR__./../app/AppKe...
AppKernel.phpIf (true === $debug) {       Saves initial time (microtime)       display_errors = 1       error_reporting = ...
app[_dev].php// web/app[_env].php1. require_once __DIR__./../app/bootstrap.php.cache;2. require_once __DIR__./../app/AppKe...
LoadClassCache   Objective: map  FQN/filenames ofclasses and interfaces
LoadClassCache It is cached inclasses.map andclasses.php.meta
app[_dev].php// web/app[_env].php1. require_once __DIR__./../app/bootstrap.php.cache;2. require_once __DIR__./../app/AppKe...
RequestHttpFoundation  Component
RequestOO abstraction of a  HTTP request
Request                                          RequestGET /index.php HTTP/1.1␍␊Host: test.com␍␊              $_GET      ...
app[_dev].php// web/app[_env].php1. require_once __DIR__./../app/bootstrap.php.cache;2. require_once __DIR__./../app/AppKe...
HttpKernel Wrapper on top ofRequest/Response tohandle the dynamic   part of HTTP
HttpKernel     Handles anenvironment consisting  of bundles, DIC...
$kernel->boot()   Initializebundles and DIC
$kernel->initializeBundles()Loads bundles defined inAppKernel::registerBundles()
$kernel->initializeContainer()   Generated using the  ContainerBuilder from  DependencyInjection
ContainerBuilder// example.com/src/container.phpuse SymfonyComponentDependencyInjection;use SymfonyComponentDependencyInje...
$kernel->initializeContainer()  {rootDir}{Environment} [Debug]ProjectContainer
$kernel->initializeContainer()     For each bundle,Bundle::build() method is executed and extensions         are loaded
$kernel->boot()  For each bundle, thecontainer is injected and  the boot() method is       executed
$kernel->handle()Goal: Return a Response        object
Event kernel.requestDispatched as soon as the request arrives
Event kernel.requestAny listener can returna Response and end    the execution
Event kernel.request       Used byFrameworkBundle to set the _controller value
RouterListenerUses a RouterMatcher(autogenerated by theRouting component)
RouterListener// app/cache/dev/appdevUrlMatcher.phpclass appdevUrlMatcher extends RedirectableUrlMatcher{   ...   public f...
ControllerResolverMust return the controller   + arguments from       _controller
FrameworkBundle  Ties components andlibraries together to make   a MVC framework
FrameworkBundleMoreover...
FrameworkBundlephp app/console
FrameworkBundle// app/console#!/usr/bin/env php<?phprequire_once __DIR__./bootstrap.php.cache;require_once __DIR__./AppKer...
FrameworkBundleCommands   assets:install    cache:clear  cache:warmup container:debugrouter:dump-apache   router:debug
FrameworkBundleBase Controller
FrameworkBundle// src/Acme/DemoBundle/Controller/DemoControllernamespace AcmeDemoBundleController;use SymfonyBundleFramewo...
FrameworkBundleAnd much more: ESI,   WebTestCase, DataCollectors...
Event kernel.controllerOnce the controller has  been resolved, this  event is generated
Event kernel.controller Any listener can manipulate theController callable
Event kernel.viewThis event is called only if the Controller doesnot return a Response
Event kernel.viewGoal: build a Responseobject from the returnvalue of the Controller
Event kernel.response  Allows to modify orreplace the Responseobject after its creation
Event kernel.exceptionLast change to convert a   Exception into a   Response object
EventsExtend from KernelEventgetRequestType(): MASTER_REQUEST or SUB_REQUESTgetKernel();getRequest();
ResponseResponse              HTTP/1.1 200 OK Headers      Content-type: text/html              Date:Thu, 31 May 2012 17:5...
app[_dev].php// web/app[_env].php1. require_once __DIR__./../app/bootstrap.php.cache;2. require_once __DIR__./../app/AppKe...
Response::send()Send headers and    content
Response::send()
Demohttps://github.com/raulfraile/  internals-desymfony2012
¡Thank you!
Photoshttp://www.flickr.com/photos/connectirmeli/7233514862 http://www.flickr.com/photos/barretthall/6070677596http://www....
Questions?
Symfony internals [english]
Symfony internals [english]
Symfony internals [english]
Upcoming SlideShare
Loading in...5
×

Symfony internals [english]

4,846

Published on

Slides from the 'Symfony internals' talk at DeSymfony

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,846
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
40
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Symfony internals [english]

  1. 1. Who am I? Raúl Fraile @raulfrailePHP/Symfony2 freelance developer
  2. 2. What do I do?
  3. 3. SensioLabsConnect
  4. 4. Why?
  5. 5. app[_dev].phpFront controller
  6. 6. app[_dev].php// web/app[_env].php1. 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();
  7. 7. bootstrap.php.cacheSeveral classes/interfaces in the same file
  8. 8. bootstrap.php.cache// app/bootstrap.php.cachenamespace { require_once __DIR__./autoload.php; }namespace SymfonyComponentDependencyInjection{ interface ContainerAwareInterface { function setContainer(ContainerInterface $container = null); } ...}
  9. 9. bootstrap.php.cacheReduces I/O operations
  10. 10. bootstrap.php.cacheLoads autoload.php
  11. 11. autoload.php// app/autoload.phpuse 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,));
  12. 12. ClassLoader Autoloading ofclasses/interfaces in Symfony2
  13. 13. ClassLoader
  14. 14. ClassLoaderImplements PSR-0
  15. 15. PSR-0 Approved by the “Framework Interop Group”github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
  16. 16. PSR-0Fully Qualified Name SymfonyCoreRequest ZendMailMessage [vendor_path]/Symfony/Core/Request.php [vendor_path]/Zend/Mail/Message.php Filesystem
  17. 17. 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; } }}
  18. 18. ClassLoader $loader->findFile( SymfonyComponentHttpFoundationRequest );/Sites/desymfony/app/../vendor/symfony/src/ Symfony/Component/HttpFoundation/Request.php
  19. 19. app[_dev].php// web/app[_env].php1. 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();
  20. 20. AppKernel.php// src/AppKernel.phpuse 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); }}
  21. 21. app[_dev].php// web/app[_env].php1. 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
  22. 22. AppKernel.phpIf (true === $debug) { Saves initial time (microtime) display_errors = 1 error_reporting = -1 DebugUniversalClassLoader} else { display_errors = 0}
  23. 23. app[_dev].php// web/app[_env].php1. 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();
  24. 24. LoadClassCache Objective: map FQN/filenames ofclasses and interfaces
  25. 25. LoadClassCache It is cached inclasses.map andclasses.php.meta
  26. 26. app[_dev].php// web/app[_env].php1. 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();
  27. 27. RequestHttpFoundation Component
  28. 28. RequestOO abstraction of a HTTP request
  29. 29. Request RequestGET /index.php HTTP/1.1␍␊Host: test.com␍␊ $_GET queryAccept-Language:en;q=0.8␍␊ requestAccept-Encoding:gzip␍␊ $_POST cookiesUser-Agent: Mozilla/5.0␍␊␍␊ files $_COOKIE server headers $_FILES getHost $_SERVER getClientIp ...
  30. 30. app[_dev].php// web/app[_env].php1. 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();
  31. 31. HttpKernel Wrapper on top ofRequest/Response tohandle the dynamic part of HTTP
  32. 32. HttpKernel Handles anenvironment consisting of bundles, DIC...
  33. 33. $kernel->boot() Initializebundles and DIC
  34. 34. $kernel->initializeBundles()Loads bundles defined inAppKernel::registerBundles()
  35. 35. $kernel->initializeContainer() Generated using the ContainerBuilder from DependencyInjection
  36. 36. ContainerBuilder// example.com/src/container.phpuse 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), newReference(resolver))) ; http://fabien.potencier.org/article/62/create-your-own-framework-on-top-of-the-symfony2-components-part-12
  37. 37. $kernel->initializeContainer() {rootDir}{Environment} [Debug]ProjectContainer
  38. 38. $kernel->initializeContainer() For each bundle,Bundle::build() method is executed and extensions are loaded
  39. 39. $kernel->boot() For each bundle, thecontainer is injected and the boot() method is executed
  40. 40. $kernel->handle()Goal: Return a Response object
  41. 41. Event kernel.requestDispatched as soon as the request arrives
  42. 42. Event kernel.requestAny listener can returna Response and end the execution
  43. 43. Event kernel.request Used byFrameworkBundle to set the _controller value
  44. 44. RouterListenerUses a RouterMatcher(autogenerated by theRouting component)
  45. 45. RouterListener// app/cache/dev/appdevUrlMatcher.phpclass 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)); } ... }
  46. 46. ControllerResolverMust return the controller + arguments from _controller
  47. 47. FrameworkBundle Ties components andlibraries together to make a MVC framework
  48. 48. FrameworkBundleMoreover...
  49. 49. FrameworkBundlephp app/console
  50. 50. FrameworkBundle// app/console#!/usr/bin/env php<?phprequire_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();
  51. 51. FrameworkBundleCommands assets:install cache:clear cache:warmup container:debugrouter:dump-apache router:debug
  52. 52. FrameworkBundleBase Controller
  53. 53. FrameworkBundle// src/Acme/DemoBundle/Controller/DemoControllernamespace AcmeDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;class DemoController extends Controller{ public function helloAction($name) { ... }}
  54. 54. FrameworkBundleAnd much more: ESI, WebTestCase, DataCollectors...
  55. 55. Event kernel.controllerOnce the controller has been resolved, this event is generated
  56. 56. Event kernel.controller Any listener can manipulate theController callable
  57. 57. Event kernel.viewThis event is called only if the Controller doesnot return a Response
  58. 58. Event kernel.viewGoal: build a Responseobject from the returnvalue of the Controller
  59. 59. Event kernel.response Allows to modify orreplace the Responseobject after its creation
  60. 60. Event kernel.exceptionLast change to convert a Exception into a Response object
  61. 61. EventsExtend from KernelEventgetRequestType(): MASTER_REQUEST or SUB_REQUESTgetKernel();getRequest();
  62. 62. ResponseResponse 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
  63. 63. app[_dev].php// web/app[_env].php1. 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();
  64. 64. Response::send()Send headers and content
  65. 65. Response::send()
  66. 66. Demohttps://github.com/raulfraile/ internals-desymfony2012
  67. 67. ¡Thank you!
  68. 68. Photoshttp://www.flickr.com/photos/connectirmeli/7233514862 http://www.flickr.com/photos/barretthall/6070677596http://www.flickr.com/photos/f-oxymoron/5005673112/
  69. 69. Questions?
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×