O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
Próximos SlideShares
Assetic (Zendcon)
Avançar
Transfira para ler offline e ver em ecrã inteiro.

5

Compartilhar

DeSymfony 2012: Symfony internals

Baixar para ler offline

Slides de la charla 'Symfony Internals' en DeSymfony 2012

DeSymfony 2012: Symfony internals

  1. 1. ¿Quién soy? Raúl Fraile @raulfraile PHP/Symfony2 freelance developer
  2. 2. ¿Qué hago?
  3. 3. SensioLabsConnect
  4. 4. ¿Por qué?
  5. 5. app[_dev].php Controlador frontal
  6. 6. 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();
  7. 7. bootstrap.php.cache Clases/namespaces en un único fichero.
  8. 8. bootstrap.php.cache // app/bootstrap.php.cache namespace { require_once __DIR__.'/autoload.php'; } namespace SymfonyComponentDependencyInjection { interface ContainerAwareInterface { function setContainer(ContainerInterface $container = null); } ... }
  9. 9. bootstrap.php.cache Reduce operaciones I/O
  10. 10. bootstrap.php.cache Carga autoload.php
  11. 11. 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', ));
  12. 12. ClassLoader Autoload de clases/interfaces en Symfony2
  13. 13. ClassLoader
  14. 14. ClassLoader Implementa PSR-0
  15. 15. PSR-0 Aprobado por el “Framework Interop Group” github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
  16. 16. PSR-0 Fully 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].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();
  20. 20. 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'); } }
  21. 21. 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
  22. 22. AppKernel.php If (true === $debug) { Guarda inicio petición (microtime) display_errors = 1 error_reporting = -1 DebugUniversalClassLoader } else { display_errors = 0 }
  23. 23. 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();
  24. 24. LoadClassCache Objetivo: mapear FQN y paths de las principales clases/interfaces
  25. 25. LoadClassCache Se cachea en classes.map y classes.php.meta
  26. 26. 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();
  27. 27. Request Componente HttpFoundation
  28. 28. Request Abstracción OO de una petición HTTP
  29. 29. 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 ...
  30. 30. 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();
  31. 31. HttpKernel Corazón de Symfony
  32. 32. HttpKernel Gestiona entorno formado por bundles, DIC...
  33. 33. $kernel->boot() Inicialización de bundles y DIC
  34. 34. $kernel->initializeBundles() Se cargan los bundles definidos en AppKernel::registerBundles()
  35. 35. $kernel->initializeContainer() Se genera usando el ContainerBuilder del DependencyInjection
  36. 36. 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
  37. 37. $kernel->initializeContainer() {rootDir}{Environment} [Debug]ProjectContainer
  38. 38. $kernel->initializeContainer() Por cada bundle se ejecuta Bundle::build() y se registran sus extensiones
  39. 39. $kernel->boot() Por cada bundle se asigna el 'container' y se ejecuta el boot()
  40. 40. $kernel->handle() Objetivo: Devolver un objeto Response
  41. 41. Evento kernel.request Se lanza en cuanto llega la petición
  42. 42. Evento kernel.request Un listener puede devolver un Response y 'finalizar' la ejecución
  43. 43. Evento kernel.request FrameworkBundle lo utiliza para rellenar el valor de _controller
  44. 44. RouterListener Utiliza un RouterMatcher (autogenerado por comp. Routing)
  45. 45. 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')); } ... }
  46. 46. ControllerResolver Encargado de devolver un controlador + argumentos a partir de _controller
  47. 47. FrameworkBundle Agrupa componentes y librerías para crear un framework MVC
  48. 48. FrameworkBundle Además, ofrece...
  49. 49. FrameworkBundle php app/console
  50. 50. 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();
  51. 51. FrameworkBundle Comandos assets:install cache:clear cache:warmup container:debug router:dump-apache router:debug
  52. 52. FrameworkBundle Controller
  53. 53. FrameworkBundle // src/Acme/DemoBundle/Controller/DemoController namespace AcmeDemoBundleController; use SymfonyBundleFrameworkBundleControllerController; class DemoController extends Controller { public function helloAction($name) { ... } }
  54. 54. FrameworkBundle Y mucho más: ESI, WebTestCase, DataCollectors...
  55. 55. Evento kernel.controller Una vez definido el controlador, se lanza el evento
  56. 56. Evento kernel.controller Se puede cambiar, pasando un Callable
  57. 57. Evento kernel.view Se lanza si el Controller no devuelve un objeto Response
  58. 58. Evento kernel.view Objetivo: construir un objeto Response del return del Controller
  59. 59. Evento kernel.response Permite reemplazar o modificar el objeto Response
  60. 60. Evento kernel.exception Oportunidad para convertir una Exception en un Response
  61. 61. Eventos Todos heredan de KernelEvent getRequestType(): MASTER_REQUEST o SUB_REQUEST getKernel(); getRequest();
  62. 62. 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
  63. 63. 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();
  64. 64. Response::send() Envía las cabeceras y el contenido
  65. 65. Response::send()
  66. 66. Demo https://github.com/raulfraile/ internals-desymfony2012
  67. 67. ¡Gracias!
  68. 68. Fotografías http://www.flickr.com/photos/connectirmeli/7233514862 http://www.flickr.com/photos/barretthall/6070677596 http://www.flickr.com/photos/f-oxymoron/5005673112/
  69. 69. ¿Preguntas?
  • slaimer

    Feb. 9, 2013
  • jordi.touza

    Jun. 17, 2012
  • tanque_tm

    Jun. 15, 2012
  • lliurealbir

    Jun. 15, 2012
  • inmarelibero

    Jun. 15, 2012

Slides de la charla 'Symfony Internals' en DeSymfony 2012

Vistos

Vistos totais

3.413

No Slideshare

0

De incorporações

0

Número de incorporações

1.271

Ações

Baixados

81

Compartilhados

0

Comentários

0

Curtir

5

×