Symfony en Drupal 8 - DrupalCamp Spain

5,878 views
6,099 views

Published on

Presentación sobre los componentes de Symfony utilizados en Drupal 8. DrupalCamp Spain

Published in: Technology
1 Comment
1 Like
Statistics
Notes
  • on slide 101 i wonder what the colors mean
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
5,878
On SlideShare
0
From Embeds
0
Number of Embeds
3,500
Actions
Shares
0
Downloads
23
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

Symfony en Drupal 8 - DrupalCamp Spain

  1. 1. Symfony en Drupal 8 Raul Fraile
  2. 2. PHP/Symfony2 dev @ PHP 5.3 Zend Certified Engineer Symfony Certified Developer LadybugPHP Sobre mi
  3. 3. https://leanpub.com/symfony-selfstudy
  4. 4. Drupal Island
  5. 5. Drupal Island Durante años, Drupal ha sido la envidia de muchos CMS/frameworks: Comunidad activa, robustez, extensibilidad… Las mejoría de PHP en los últimos años le obliga a cambiar.
  6. 6. Drupal Island 5.3+ Mejoras en OO Namespaces Closures Traits Funciones generadoras Composer
  7. 7. function drupal_http_request($url, array $options = array()) { // Allow an alternate HTTP client library to replace Drupal's default // implementation. $override_function = variable_get('drupal_http_request_function', FALSE); if (!empty($override_function) && function_exists($override_function)) { return $override_function($url, $options); } $result = new stdClass(); // Parse the URL and make sure we can handle the schema. $uri = @parse_url($url); if ($uri == FALSE) { $result->error = 'unable to parse URL'; $result->code = -1001; return $result; } if (!isset($uri['scheme'])) { $result->error = 'missing schema'; $result->code = -1002; return $result; } timer_start(__FUNCTION__); // Merge the default options. $options += array( 'headers' => array(), Drupal Island LOC: 304 Complejidad ciclomática: 41 N-Path: 25.303.344.960 drupal_http_request()
  8. 8. Drupal Island N-Path ≈ Núm. caminos ≈ Tests 2 TB de tests 412 DVDs de tests 670K Drupals de tests drupal_http_request()
  9. 9. Drupal Island slideshare.net/ircmaxell/development-by-the-numbers Anthony Ferrara
  10. 10. Drupal Island Dificultad para mantener el código. Código antiguo, compatibilidad con PHP 4. Orientación a objetos testimonial. Reinventando la rueda.
  11. 11. Drupal Island
  12. 12. NIHNot Invented Here PIEProudly Found Elsewhere Drupal Island
  13. 13. Drupal Island
  14. 14. ClassLoader DependencyInjection EventDispatcher HttpFoundation HttpKernel Routing Serializer Validator Yaml Twig Doctrine Common Doctrine Annotations Guzzle Assetic SymfonyCMF Routing EasyRDF PHPUnit Zend Feed Drupal Island
  15. 15. 50% de las dependencias de Drupal 8 son componentes de Symfony Drupal Island
  16. 16. ¿Por qué Symfony?
  17. 17. Proyecto maduro y de calidad. Basado en componentes. “Líder” de la revolución contra los frameworks monolíticos. Comunidad grande y activa. ¿Por qué Symfony?
  18. 18. Componentes de Symfony2
  19. 19. Conjunto de librerías desacopladas e independientes. Implementan funcionalidad común para sitios/apps web. Bloques con los que se construye el full-stack framework. Componentes de Symfony2
  20. 20. HttpFoundation
  21. 21. Abstracción del protocolo HTTP. El origen de la colaboración entre Symfony y Drupal. HttpFoundation
  22. 22. query request 
 cookies files server headers getScheme getHost getClientIp getMethod getContentType getPreferredLanguage HttpFoundation $_GET $_POST $_COOKIE $_FILES $_SERVER GET /index.php HTTP/1.1 Host: test.com Accept-Language:en;q=0.8 Accept-Encoding:gzip User-Agent: Mozilla/5.0
  23. 23. HttpFoundation use SymfonyComponentHttpFoundationRequest; use SymfonyComponentHttpFoundationResponse; $request = Request::createFromGlobals(); $html = sprintf( '<h1>Hola %s!</h1>', $request->query->get('name', 'Raul')); $response = new Response($html); $response ->headers->set("content-type", "text/html"); $response->send();
  24. 24. HttpKernel
  25. 25. El componente HttpKernel define un proceso abstracto para convertir un objeto Request en un Response: HttpKernelInterface HttpKernel
  26. 26. HttpKernel Request ResponseHttpKernelInterface
  27. 27. Negociación Caché HttpKernel Aplicación Middleware
  28. 28. El componente dispone de una implementación concreta de HttpKernelInterface. Diseñada para ser muy flexible, con eventos “estándar”. HttpKernel
  29. 29. HttpKernel kernel.request Request Response kernel.controller kernel.view kernel.response kernel.terminate kernel.exception
  30. 30. ClassLoader
  31. 31. El componente ClassLoader permite realizar autoload de clases en PHP. Un único require/include por aplicación. Permite cachear las rutas para ganar rendimiento. Dispone de 2 autoloaders: PSR-0 y MapClass. ClassLoader
  32. 32. Cada vez que se utiliza una clase que no ha sido incluida previamente, PHP utiliza el mecanismo de autoload. FQN + reglas/map = require(archivo) ClassLoader
  33. 33. require_once( ) ClassLoader new MyClass() ClassMap PSR-0/4 Path
  34. 34. require_once( ) ClassLoader new MyClass() ClassMap PSR-0/4 Path
  35. 35. ClassLoader PHP Framework Interop Group The idea behind the group is for project representatives to talk about the commonalities between our projects and find ways we can work together. Our main audience is each other, but we’re very aware that the rest of the PHP community is watching. If other folks want to adopt what we’re doing they are welcome to do so, but that is not the aim.
  36. 36. ClassLoader PHP Framework Interop Group PSR-0 Autoloading Standard PSR-1 Basic Coding Standard PSR-2 Coding Style Guide PSR-3 Logger Interface PSR-4 Improved Autoloading
  37. 37. Routing
  38. 38. El componente Routing relaciona peticiones HTTP con un conjunto de variables. Simplifica la tarea de crear URLs amigables. Intenta no afectar demasiado al rendimiento de la aplicación. Routing
  39. 39. Routing use SymfonyComponentRoutingMatcherUrlMatcher; use SymfonyComponentRoutingRequestContext; use SymfonyComponentRoutingRouteCollection; use SymfonyComponentRoutingRoute; use SymfonyComponentHttpFoundationRequest; $collection = new RouteCollection(); $collection->add('help', new Route('/help', array( 'controller' => 'HelpController', 'action' => 'indexAction' ))); $collection->add('about', new Route('/about', array( 'controller' => 'AboutController', 'action' => 'indexAction' ))); $context = new RequestContext(); $context->fromRequest(Request::createFromGlobals()); $matcher = new UrlMatcher($collection, $context);
  40. 40. EventDispatcher
  41. 41. El componente EventDispatcher implementa el patrón Mediador (Mediator Pattern), permitiendo desacoplar nuestro código. Alternativa OO a los clásicos hooks de Drupal. EventDispatcher
  42. 42. EventDispatcher Productor Consumidor Consumidor Consumidor Consumidor Mediador
  43. 43. EventDispatcher use SymfonyComponentEventDispatcherEventDispatcher; use SymfonyComponentEventDispatcherEvent; $dispatcher = new EventDispatcher(); // add listeners $dispatcher->addListener('blog.post.saved', function (BlogPostEvent $event) { echo 'Updating RSS feed' . PHP_EOL; }); $dispatcher->addListener('blog.post.saved', function (BlogPostEvent $event) { echo 'Sending emails' . PHP_EOL; }); // save the post // … // dispatch the event $event = new BlogPostEvent($blogPost); $dispatcher->dispatch('blog.post.saved', $event);
  44. 44. DependencyInjection
  45. 45. El componente DependencyInjection permite centralizar la construcción de objetos de la aplicación. La inyección de dependencias es un patrón de diseño de software. Las dependencias no se crean (no new), se inyectan. Más flexibilidad y reusabilidad. DependencyInjection
  46. 46. DependencyInjection class Blog { protected $mailer; protected $posts; function __construct() { $this->mailer = new MyMailer(); } function addPost(Post $post) { $this->posts[] = $post; $this->sendMail($post); } function sendMail(Post $post) { $this->mailer->send(/* ... */); } }
  47. 47. DependencyInjection class Blog { protected $mailer; protected $posts; function __construct(MailerInterface $mailer) { $this->mailer = $mailer; } function addPost(Post $post) { $this->posts[] = $post; $this->sendMail($post); } function sendMail(Post $post) { $this->mailer->send(/* ... */); } }
  48. 48. DependencyInjection DIC SMTP … $container->get(“Mailer”) Mailer
  49. 49. DependencyInjection leanpub.com/a-year-with-symfony Matthias Noback
  50. 50. Validator
  51. 51. El componente Validator permite validar información de entrada a nuestra aplicación. Basado en la especificación JSR 303. Se divide en constraints y validators. Validator
  52. 52. Validator use SymfonyComponentValidatorValidation; use SymfonyComponentValidatorConstraintsRange; $validator = Validation::createValidator(); $constraint = new Range(array( 'min' => 1, 'max' => 10 )); $violations = $validator->validateValue( 15, $constraint );
  53. 53. Validator NotBlank Ip DateTime CardScheme Blank Range Time Currency NotNull EqualTo Choice Luhn Null NotEqualTo Collection Iban True IdenticalTo Count Isbn False NotIdenticalTo UniqueEntity Issn Type LessThan Language Callback Email LessThanOrEqual Locale Expression Length GreaterThan Country All Url GreaterThanOrEqual File UserPassword Regex Date Image Valid
  54. 54. Serializer
  55. 55. El componente Serializer convierte objetos PHP en otros formatos (p.ej. JSON) y viceversa. Está diseñado para que pueda ser extensible. Serializer
  56. 56. Serializer Objeto FormatoArray Serialización Deserialización
  57. 57. Yaml
  58. 58. El componente Yaml parsea y serializa archivos en formato YAML (YAML Ain't Markup Language). YAML es un formato de serialización de datos amigable para humanos. Soporte para múltiples lenguajes de programación. Yaml
  59. 59. Yaml use SymfonyComponentYamlParser; use SymfonyComponentYamlDumper; $parser = new Parser(); $data = $parser->parse( file_get_contents(‘data.yml') ); $dumper = new Dumper(); $yaml = $dumper->dump($data); file_put_contents('data2.yml', $yaml);
  60. 60. Recursos
  61. 61. Recursos symfony.es/libro Javier Eguiluz
  62. 62. Recursos blog.servergrove.com/tag/symfony2-components
  63. 63. Gràcies! @raulfraile

×