O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

Desarrollo código mantenible en WordPress utilizando Symfony

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Carregando em…3
×

Confira estes a seguir

1 de 41 Anúncio

Desarrollo código mantenible en WordPress utilizando Symfony

Baixar para ler offline

El objetivo de esta charla es mostrar cómo aplicar buenas prácticas de desarrollo cuando trabajemos con WordPress, implementando PSRs y desacoplando nuestro código para poder migrarlo en un futuro a otras opciones sin esfuerzo y dotarle de una buena cobertura de tests.

Veremos cómo podemos desarrollar y mantener plataformas basadas en WordPress utilizando cosas como inyección de dependencias, rutas en anotaciones y controladores; cómo utilizar composer para plugins, themes y sus dependencias; cómo montar los despliegues y qué opciones tenemos para utilizar WordPress desde nuestros Bundes.

El objetivo de esta charla es mostrar cómo aplicar buenas prácticas de desarrollo cuando trabajemos con WordPress, implementando PSRs y desacoplando nuestro código para poder migrarlo en un futuro a otras opciones sin esfuerzo y dotarle de una buena cobertura de tests.

Veremos cómo podemos desarrollar y mantener plataformas basadas en WordPress utilizando cosas como inyección de dependencias, rutas en anotaciones y controladores; cómo utilizar composer para plugins, themes y sus dependencias; cómo montar los despliegues y qué opciones tenemos para utilizar WordPress desde nuestros Bundes.

Anúncio
Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Quem viu também gostou (20)

Anúncio

Semelhante a Desarrollo código mantenible en WordPress utilizando Symfony (20)

Mais de Asier Marqués (20)

Anúncio

Mais recentes (20)

Desarrollo código mantenible en WordPress utilizando Symfony

  1. 1. Acerca de mí Asier Marqués One man army in Simettric.com @asiermarques github.com/Simettric linkedin.com/in/asier
  2. 2. "Cuando miras al abismo, el abismo también mira dentro de tí"
  3. 3. WtfPress
  4. 4. WtfPress hell — HTTP vs WP_Query — Hooks oriented development — Dependencias (plugins) delegadas en el usuario — Ausencia de aplicación de PSRs — No se utiliza Composer
  5. 5. Wtf_Query /category/animales => index.php?category=animales WP_Query( array( “category” => “animales”) ); theme/category.php
  6. 6. Template hierarchy
  7. 7. WP_Query ruta personalizada add_action('init', function() { add_rewrite_rule( '^tasks/([^/]*)/?', 'index.php?post_type=task' . '&category=$matches[1]' . '&controller=mi_accion', 'top' ); add_rewrite_tag('%controller%', '(([^/]*))'); });
  8. 8. Al entrar en esa ruta... $wp_query->query_vars["post_type"] $wp_query->query_vars["category"] $wp_query->query_vars["controller"]
  9. 9. ...podemos llamar a nuestro "controlador" add_action('parse_query', function(WP_Query $wp_query) { if( $wp_query->query_vars["controller"] == "mi_accion" ) { // ¿mi controlador? } });
  10. 10. Hooks driven development
  11. 11. WordPress heaven — Mercado — Tendencia a utilizarse como prototipo para validar mercado — Su uso masivo
  12. 12. Cómo mejorarlo — Composer — Injección de dependencias — Mejor gestión de rutas — Eliminar lógica de negocio en templates — MVC — Sin romper compatibilidad
  13. 13. Demo
  14. 14. Aplicando MVC e Inyección de dependencias
  15. 15. Inyección de dependencias $container = new ContainerBuilder(); $loader = new YamlFileLoader($container, new FileLocator([__DIR__ . "/Config"])); $loader->load('services.yml');
  16. 16. Nuestro controller class MiControlador { /** * Route("/custom-path/{method}", name="mi_ruta"); */ function miAccion(Request $request) { return 'template.php'; } }
  17. 17. Anotación de ruta /** * @Annotation * @Target({"PROPERTY"}) */ class Route{ /** @var string */ public $path; /** @var string */ public $name; function __construct( $data=[] ){ if (isset($data['value'])) { $data['path'] = $data['value']; unset($data['value']); } } }
  18. 18. Recopilando las rutas $routes = []; AnnotationRegistry::registerFile( __DIR__ . "/Annotations/Route.php" ); $reflClass = new ReflectionClass("MiControlador.php"); foreach($reflClass->getMethods() as $method) { $classAnnotations = $reader->getMethodAnnotations($method); foreach ($classAnnotations as $route) { $routes[$route->name] = $route; } }
  19. 19. Ejecutar controlador add_action('parse_query', function(WP_Query $wp_query) use ($container) { if($route_name = $wp_query->query_vars[“route_name”]) { if(isset( $routes[$route_name] )) { $route = $routes[$route_name]; $controller = $route->createControllerInstance( $container ); $template = call_user_function( [ $controller, $route->getAction() ] ); $container->get("view")->setTemplate($template); } } });
  20. 20. Vistas add_filter( 'template_include', function ( $template ) use ($container) { return $container->get("view")->getTemplate() ? : $template; }
  21. 21. ¿Twig? Una de las formas de hacerlo (ejemplo simplificado) add_filter( 'template_include', function ( $template ) use ($container) { if ( $template = $container->get("wp_query")->query_vars["twig.template"] ) { $twig = $container->get("twig"); $twig->render( $template ); // gestionar el response y terminar ejecución } return $template; }
  22. 22. sense.simettic.com github.com/Simettric/Sense Un proyecto en desarrollo activo, se acepta feedback asier@simettric.com
  23. 23. Composer
  24. 24. Composer — WPackagist.org — Composer installers
  25. 25. "repositories": [ { "type": "composer", "url": "https://wpackagist.org" } ], "require": { "php": ">=5.4", "composer/installers": "1.*", "johnpbloch/wordpress": "4.*", "wpackagist-plugin/akismet": "dev-trunk", "wpackagist-theme/hueman": "*" }, "extra": { "wordpress-install-dir": "public/_wordpress/", "installer-paths": { "public/wp-content/plugins/{$name}/": ["type:wordpress-plugin"], "public/wp-content/themes/{$name}/": ["type:wordpress-theme"] } }
  26. 26. Estructura de directorios con Composer Gestionados por composer — public/_wordpress/ — public/wp-content/ — vendor/ Punto de entrada y configuración — public/index.php — public/wp-config.php
  27. 27. public/index.php define('WP_USE_THEMES', true); require( __DIR__ . '/_wordpress/wp-blog-header.php' );
  28. 28. public/wp-config.php require __DIR__ . '/../vendor/autoload.php'; define( 'SITE_HOST', 'http://example.com' ); define( 'WP_SITEURL', SITE_HOST . '/_wordpress' ); define( 'WP_HOME', SITE_HOST . '/' ); define( 'WP_CONTENT_DIR', __DIR__ . '/wp-content' ); define( 'WP_CONTENT_URL', SITE_HOST . '/wp-content' ); if ( !defined('ABSPATH') ) define('ABSPATH', __DIR__ . '/_wordpress');
  29. 29. Demo
  30. 30. Una instalación base github.com/Simettric/wordpress-composer- installation
  31. 31. Entornos mixtos WordPress + Symfony EkinoWordpressBundle
  32. 32. Seguridad Usando el login de WordPress para autenticarme en Symfony ekino_wordpress: security: firewall_name: "secured_area" login_url: "/wp-login.php" security: providers: main: entity: { class: EkinoWordpressBundleEntityUser, property: login } firewalls: secured_area: pattern: ^/admin access_denied_handler: ekino.wordpress.security.entry_point entry_point: ekino.wordpress.security.entry_point anonymous: ~ access_control: - { path: ^/admin, roles: ROLE_WP_ADMINISTRATOR }
  33. 33. Repositorios $postManager = $this->get('ekino.wordpress.manager.post'); $userManager = $this->get('ekino.wordpress.manager.user'); $user = $userManager->find(2); $post = $postManager->find(1); $post->setAuthor($user); $postManager->save($post);
  34. 34. Conclusiones — Se puede crear buen código en WordPress sin estar acoplado — Se puede iniciar un proyecto en WordPress y migrar a Symfony después — Se pueden integrar ambas plataformas
  35. 35. Code is poetry a symphony
  36. 36. Gracias
  37. 37. ¿Preguntas? Asier Marqués One man army in Simettric.com @asiermarques github.com/Simettric linkedin.com/in/asier

×