41

Desarrollo código mantenible en WordPress utilizando Symfony

Embed Size (px)

Citation preview

Page 1: Desarrollo código mantenible en WordPress utilizando Symfony
Page 2: Desarrollo código mantenible en WordPress utilizando Symfony
Page 3: Desarrollo código mantenible en WordPress utilizando Symfony

Acerca de mí

Asier MarquésOne man army in Simettric.com

@asiermarquesgithub.com/Simettriclinkedin.com/in/asier

Page 4: Desarrollo código mantenible en WordPress utilizando Symfony

"Cuando miras al abismo, el abismo también mira

dentro de tí"

Page 5: Desarrollo código mantenible en WordPress utilizando Symfony

WtfPress

Page 6: Desarrollo código mantenible en WordPress utilizando Symfony

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

Page 7: Desarrollo código mantenible en WordPress utilizando Symfony

Wtf_Query

/category/animales => index.php?category=animales

WP_Query( array( “category” => “animales”) );

theme/category.php

Page 8: Desarrollo código mantenible en WordPress utilizando Symfony

Template hierarchy

Page 9: Desarrollo código mantenible en WordPress utilizando Symfony

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%', '(([^/]*))');

});

Page 10: Desarrollo código mantenible en WordPress utilizando Symfony

Al entrar en esa ruta...

$wp_query->query_vars["post_type"]

$wp_query->query_vars["category"]

$wp_query->query_vars["controller"]

Page 11: Desarrollo código mantenible en WordPress utilizando Symfony

...podemos llamar a nuestro "controlador"

add_action('parse_query', function(\WP_Query $wp_query) {

if( $wp_query->query_vars["controller"] == "mi_accion" ) { // ¿mi controlador? }

});

Page 12: Desarrollo código mantenible en WordPress utilizando Symfony
Page 13: Desarrollo código mantenible en WordPress utilizando Symfony

Hooks driven development

Page 14: Desarrollo código mantenible en WordPress utilizando Symfony

WordPress heaven

— Mercado

— Tendencia a utilizarse como prototipo para validar mercado

— Su uso masivo

Page 15: Desarrollo código mantenible en WordPress utilizando Symfony

Cómo mejorarlo

— Composer

— Injección de dependencias

— Mejor gestión de rutas

— Eliminar lógica de negocio en templates

— MVC

— Sin romper compatibilidad

Page 16: Desarrollo código mantenible en WordPress utilizando Symfony

Demo

Page 17: Desarrollo código mantenible en WordPress utilizando Symfony

Aplicando MVC e Inyección de dependencias

Page 18: Desarrollo código mantenible en WordPress utilizando Symfony

Inyección de dependencias

$container = new ContainerBuilder();

$loader = new YamlFileLoader($container, new FileLocator([__DIR__ . "/Config"]));

$loader->load('services.yml');

Page 19: Desarrollo código mantenible en WordPress utilizando Symfony

Nuestro controller

class MiControlador {

/** * Route("/custom-path/{method}", name="mi_ruta"); */ function miAccion(Request $request) {

return 'template.php'; }

}

Page 20: Desarrollo código mantenible en WordPress utilizando Symfony

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']); }

}

}

Page 21: Desarrollo código mantenible en WordPress utilizando Symfony

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;

}}

Page 22: Desarrollo código mantenible en WordPress utilizando Symfony

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); } }});

Page 23: Desarrollo código mantenible en WordPress utilizando Symfony

Vistas

add_filter( 'template_include', function ( $template ) use ($container) {

return $container->get("view")->getTemplate() ? : $template;

}

Page 24: Desarrollo código mantenible en WordPress utilizando Symfony

¿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;

}

Page 25: Desarrollo código mantenible en WordPress utilizando Symfony
Page 26: Desarrollo código mantenible en WordPress utilizando Symfony

sense.simettic.comgithub.com/Simettric/Sense

Un proyecto en desarrollo activo, se acepta feedback [email protected]

Page 27: Desarrollo código mantenible en WordPress utilizando Symfony

Composer

Page 28: Desarrollo código mantenible en WordPress utilizando Symfony

Composer

— WPackagist.org

— Composer installers

Page 29: Desarrollo código mantenible en WordPress utilizando Symfony

"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"] } }

Page 30: Desarrollo código mantenible en WordPress utilizando Symfony

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

Page 31: Desarrollo código mantenible en WordPress utilizando Symfony

public/index.php

define('WP_USE_THEMES', true);

require( __DIR__ . '/_wordpress/wp-blog-header.php' );

Page 32: Desarrollo código mantenible en WordPress utilizando Symfony

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');

Page 33: Desarrollo código mantenible en WordPress utilizando Symfony

Demo

Page 34: Desarrollo código mantenible en WordPress utilizando Symfony

Una instalación base

github.com/Simettric/wordpress-composer-installation

Page 35: Desarrollo código mantenible en WordPress utilizando Symfony

Entornos mixtos WordPress + Symfony

EkinoWordpressBundle

Page 36: Desarrollo código mantenible en WordPress utilizando Symfony

SeguridadUsando 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: Ekino\WordpressBundle\Entity\User, 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 }

Page 37: Desarrollo código mantenible en WordPress utilizando Symfony

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);

Page 38: Desarrollo código mantenible en WordPress utilizando Symfony

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

Page 39: Desarrollo código mantenible en WordPress utilizando Symfony

Code is poetry a symphony

Page 40: Desarrollo código mantenible en WordPress utilizando Symfony

Gracias

Page 41: Desarrollo código mantenible en WordPress utilizando Symfony

¿Preguntas?

Asier MarquésOne man army in Simettric.com

@asiermarquesgithub.com/Simettriclinkedin.com/in/asier