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.
Symfony en Drupal 8
Raul Fraile
PHP/Symfony2 dev @
PHP 5.3 Zend Certified Engineer
Symfony Certified Developer
LadybugPHP
Sobre mi
https://leanpub.com/symfony-selfstudy
Drupal Island
Drupal Island
Durante años, Drupal ha sido la
envidia de muchos CMS/frameworks:
Comunidad activa, robustez,
extensibilidad...
Drupal Island
5.3+
Mejoras en OO
Namespaces
Closures
Traits
Funciones generadoras
Composer
function drupal_http_request($url, array $options = array()) {
// Allow an alternate HTTP client library to replace Drupal...
Drupal Island
N-Path ≈ Núm. caminos ≈ Tests
2 TB de tests
412 DVDs de tests
670K Drupals de tests
drupal_http_request()
Drupal Island
slideshare.net/ircmaxell/development-by-the-numbers
Anthony
Ferrara
Drupal Island
Dificultad para mantener el código.
Código antiguo, compatibilidad con
PHP 4.
Orientación a objetos testimoni...
Drupal Island
NIHNot Invented Here
PIEProudly Found Elsewhere
Drupal Island
Drupal Island
ClassLoader
DependencyInjection
EventDispatcher
HttpFoundation
HttpKernel
Routing
Serializer
Validator
Yaml
Twig
Doctrine ...
50% de las
dependencias de
Drupal 8 son
componentes de
Symfony
Drupal Island
¿Por qué Symfony?
Proyecto maduro y de calidad.
Basado en componentes. “Líder” de
la revolución contra los frameworks
monolíticos.
Comunidad...
Componentes de
Symfony2
Conjunto de librerías desacopladas e
independientes.
Implementan funcionalidad común
para sitios/apps web.
Bloques con los...
HttpFoundation
Abstracción del protocolo HTTP.
El origen de la colaboración entre
Symfony y Drupal.
HttpFoundation
query
request 

cookies
files
server
headers
getScheme
getHost
getClientIp
getMethod
getContentType
getPreferredLanguage
H...
HttpFoundation
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
$request = Request::...
HttpKernel
El componente HttpKernel define
un proceso abstracto para convertir
un objeto Request en un Response:
HttpKernelInterface
...
HttpKernel
Request ResponseHttpKernelInterface
Negociación
Caché
HttpKernel
Aplicación
Middleware
El componente dispone de una
implementación concreta de
HttpKernelInterface.
Diseñada para ser muy flexible, con
eventos “...
HttpKernel
kernel.request
Request
Response
kernel.controller
kernel.view kernel.response
kernel.terminate
kernel.exception
ClassLoader
El componente ClassLoader permite
realizar autoload de clases en PHP.
Un único require/include por aplicación.
Permite cac...
Cada vez que se utiliza una clase
que no ha sido incluida previamente,
PHP utiliza el mecanismo de
autoload.
FQN + reglas/...
require_once( )
ClassLoader
new MyClass()
ClassMap PSR-0/4
Path
require_once( )
ClassLoader
new MyClass()
ClassMap PSR-0/4
Path
ClassLoader
PHP Framework Interop Group
The idea behind the group is for project
representatives to talk about the
commona...
ClassLoader
PHP Framework Interop Group
PSR-0 Autoloading Standard
PSR-1 Basic Coding Standard
PSR-2 Coding Style Guide
PS...
Routing
El componente Routing relaciona
peticiones HTTP con un conjunto de
variables.
Simplifica la tarea de crear URLs
amigables....
Routing
use SymfonyComponentRoutingMatcherUrlMatcher;
use SymfonyComponentRoutingRequestContext;
use SymfonyComponentRouti...
EventDispatcher
El componente EventDispatcher
implementa el patrón Mediador
(Mediator Pattern), permitiendo
desacoplar nuestro código.
Alt...
EventDispatcher
Productor
Consumidor
Consumidor
Consumidor
Consumidor
Mediador
EventDispatcher
use SymfonyComponentEventDispatcherEventDispatcher;
use SymfonyComponentEventDispatcherEvent;
$dispatcher ...
DependencyInjection
El componente DependencyInjection
permite centralizar la construcción de
objetos de la aplicación.
La inyección de depende...
DependencyInjection
class Blog
{
protected $mailer;
protected $posts;
function __construct()
{
$this->mailer = new MyMaile...
DependencyInjection
class Blog
{
protected $mailer;
protected $posts;
function __construct(MailerInterface $mailer)
{
$thi...
DependencyInjection
DIC
SMTP …
$container->get(“Mailer”)
Mailer
DependencyInjection
leanpub.com/a-year-with-symfony
Matthias
Noback
Validator
El componente Validator permite
validar información de entrada a
nuestra aplicación.
Basado en la especificación JSR 303.
...
Validator
use SymfonyComponentValidatorValidation;
use SymfonyComponentValidatorConstraintsRange;
$validator = Validation:...
Validator
NotBlank Ip DateTime CardScheme
Blank Range Time Currency
NotNull EqualTo Choice Luhn
Null NotEqualTo Collection...
Serializer
El componente Serializer convierte
objetos PHP en otros formatos (p.ej.
JSON) y viceversa.
Está diseñado para que pueda se...
Serializer
Objeto FormatoArray
Serialización
Deserialización
Yaml
El componente Yaml parsea y serializa
archivos en formato YAML (YAML Ain't
Markup Language).
YAML es un formato de seriali...
Yaml
use SymfonyComponentYamlParser;
use SymfonyComponentYamlDumper;
$parser = new Parser();
$data = $parser->parse(
file_...
Recursos
Recursos
symfony.es/libro
Javier
Eguiluz
Recursos
blog.servergrove.com/tag/symfony2-components
Gràcies!
@raulfraile
Próximos SlideShares
Carregando em…5
×

de

Symfony en Drupal 8 - DrupalCamp Spain  Slide 1 Symfony en Drupal 8 - DrupalCamp Spain  Slide 2 Symfony en Drupal 8 - DrupalCamp Spain  Slide 3 Symfony en Drupal 8 - DrupalCamp Spain  Slide 4 Symfony en Drupal 8 - DrupalCamp Spain  Slide 5 Symfony en Drupal 8 - DrupalCamp Spain  Slide 6 Symfony en Drupal 8 - DrupalCamp Spain  Slide 7 Symfony en Drupal 8 - DrupalCamp Spain  Slide 8 Symfony en Drupal 8 - DrupalCamp Spain  Slide 9 Symfony en Drupal 8 - DrupalCamp Spain  Slide 10 Symfony en Drupal 8 - DrupalCamp Spain  Slide 11 Symfony en Drupal 8 - DrupalCamp Spain  Slide 12 Symfony en Drupal 8 - DrupalCamp Spain  Slide 13 Symfony en Drupal 8 - DrupalCamp Spain  Slide 14 Symfony en Drupal 8 - DrupalCamp Spain  Slide 15 Symfony en Drupal 8 - DrupalCamp Spain  Slide 16 Symfony en Drupal 8 - DrupalCamp Spain  Slide 17 Symfony en Drupal 8 - DrupalCamp Spain  Slide 18 Symfony en Drupal 8 - DrupalCamp Spain  Slide 19 Symfony en Drupal 8 - DrupalCamp Spain  Slide 20 Symfony en Drupal 8 - DrupalCamp Spain  Slide 21 Symfony en Drupal 8 - DrupalCamp Spain  Slide 22 Symfony en Drupal 8 - DrupalCamp Spain  Slide 23 Symfony en Drupal 8 - DrupalCamp Spain  Slide 24 Symfony en Drupal 8 - DrupalCamp Spain  Slide 25 Symfony en Drupal 8 - DrupalCamp Spain  Slide 26 Symfony en Drupal 8 - DrupalCamp Spain  Slide 27 Symfony en Drupal 8 - DrupalCamp Spain  Slide 28 Symfony en Drupal 8 - DrupalCamp Spain  Slide 29 Symfony en Drupal 8 - DrupalCamp Spain  Slide 30 Symfony en Drupal 8 - DrupalCamp Spain  Slide 31 Symfony en Drupal 8 - DrupalCamp Spain  Slide 32 Symfony en Drupal 8 - DrupalCamp Spain  Slide 33 Symfony en Drupal 8 - DrupalCamp Spain  Slide 34 Symfony en Drupal 8 - DrupalCamp Spain  Slide 35 Symfony en Drupal 8 - DrupalCamp Spain  Slide 36 Symfony en Drupal 8 - DrupalCamp Spain  Slide 37 Symfony en Drupal 8 - DrupalCamp Spain  Slide 38 Symfony en Drupal 8 - DrupalCamp Spain  Slide 39 Symfony en Drupal 8 - DrupalCamp Spain  Slide 40 Symfony en Drupal 8 - DrupalCamp Spain  Slide 41 Symfony en Drupal 8 - DrupalCamp Spain  Slide 42 Symfony en Drupal 8 - DrupalCamp Spain  Slide 43 Symfony en Drupal 8 - DrupalCamp Spain  Slide 44 Symfony en Drupal 8 - DrupalCamp Spain  Slide 45 Symfony en Drupal 8 - DrupalCamp Spain  Slide 46 Symfony en Drupal 8 - DrupalCamp Spain  Slide 47 Symfony en Drupal 8 - DrupalCamp Spain  Slide 48 Symfony en Drupal 8 - DrupalCamp Spain  Slide 49 Symfony en Drupal 8 - DrupalCamp Spain  Slide 50 Symfony en Drupal 8 - DrupalCamp Spain  Slide 51 Symfony en Drupal 8 - DrupalCamp Spain  Slide 52 Symfony en Drupal 8 - DrupalCamp Spain  Slide 53 Symfony en Drupal 8 - DrupalCamp Spain  Slide 54 Symfony en Drupal 8 - DrupalCamp Spain  Slide 55 Symfony en Drupal 8 - DrupalCamp Spain  Slide 56 Symfony en Drupal 8 - DrupalCamp Spain  Slide 57 Symfony en Drupal 8 - DrupalCamp Spain  Slide 58 Symfony en Drupal 8 - DrupalCamp Spain  Slide 59 Symfony en Drupal 8 - DrupalCamp Spain  Slide 60 Symfony en Drupal 8 - DrupalCamp Spain  Slide 61 Symfony en Drupal 8 - DrupalCamp Spain  Slide 62 Symfony en Drupal 8 - DrupalCamp Spain  Slide 63
Próximos SlideShares
Composer: Gestionando dependencias en PHP
Avançar
Transfira para ler offline e ver em ecrã inteiro.

1 gostou

Compartilhar

Baixar para ler offline

Symfony en Drupal 8 - DrupalCamp Spain

Baixar para ler offline

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

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
  • keopx

    Jun. 25, 2014

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

Vistos

Vistos totais

7.088

No Slideshare

0

De incorporações

0

Número de incorporações

3.996

Ações

Baixados

26

Compartilhados

0

Comentários

0

Curtir

1

×