las buenas prácticas oficiales para aplicaciones symfony

133
Sensio Labs SYMFONY BUENAS PRÁCTICAS Javier Eguiluz

Upload: symfonybcn

Post on 14-Jul-2015

315 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Las buenas prácticas oficiales para aplicaciones Symfony

SensioLabs

SYMFONYBUENAS PRÁCTICAS

Javier Eguiluz

Page 2: Las buenas prácticas oficiales para aplicaciones Symfony

Symfony Barcelona

gracias a

Page 3: Las buenas prácticas oficiales para aplicaciones Symfony

Marc Morera @mmoreram

gracias a

Page 4: Las buenas prácticas oficiales para aplicaciones Symfony

Elcodi Symfony components based e-commerce platform

gracias a

Page 5: Las buenas prácticas oficiales para aplicaciones Symfony

Introducción

Page 6: Las buenas prácticas oficiales para aplicaciones Symfony

13OCTUBRE

Page 7: Las buenas prácticas oficiales para aplicaciones Symfony

Las buenas prácticas oficiales

Conjunto de técnicas que puedes utilizar para desarrollar aplicaciones Symfony como recomiendan sus creadores.

Page 8: Las buenas prácticas oficiales para aplicaciones Symfony

symfony.com/best-practices

LIBROSWEB

FABIEN POTENCIER RYAN WEAVER JAVIER EGUILUZ

BUENAS PRÁCTICAS PARA APLICACIONES SYMFONY

bit.ly/buenas-practicas-symfony

50 páginas

57 páginas

Page 9: Las buenas prácticas oficiales para aplicaciones Symfony

¿Por qué?

Las buenas prácticas oficiosas complican mucho el desarrollo de aplicaciones y no siguen la filosofía pragmática de los creadores de Symfony.

Page 10: Las buenas prácticas oficiales para aplicaciones Symfony

Definición de “Best Practice”

A well defined procedure that is known to produce near-optimum results.

Page 11: Las buenas prácticas oficiales para aplicaciones Symfony

Definición de “Pragmatic”

Concerned with making decisions and actions that are useful in practice, not just theory.

Page 12: Las buenas prácticas oficiales para aplicaciones Symfony

Las buenas prácticas Symfony

Page 13: Las buenas prácticas oficiales para aplicaciones Symfony

Las buenas prácticas Symfony• Reflejan las ideas de su creador.

Page 14: Las buenas prácticas oficiales para aplicaciones Symfony

Las buenas prácticas Symfony• Reflejan las ideas de su creador.• Son opcionales.

Page 15: Las buenas prácticas oficiales para aplicaciones Symfony

Las buenas prácticas Symfony• Reflejan las ideas de su creador.• Son opcionales.• Symfony no cambiará para obligarte a usarlas.

Page 16: Las buenas prácticas oficiales para aplicaciones Symfony

Usa las buenas prácticas …

Page 17: Las buenas prácticas oficiales para aplicaciones Symfony

Usa las buenas prácticas …• En proyectos pequeños y medianos.

Page 18: Las buenas prácticas oficiales para aplicaciones Symfony

Usa las buenas prácticas …• En proyectos pequeños y medianos.• En proyectos web estándar.

Page 19: Las buenas prácticas oficiales para aplicaciones Symfony

Usa las buenas prácticas …• En proyectos pequeños y medianos.• En proyectos web estándar.• Si eres nuevo/a en Symfony.

Page 20: Las buenas prácticas oficiales para aplicaciones Symfony

No uses las buenas prácticas …

Page 21: Las buenas prácticas oficiales para aplicaciones Symfony

No uses las buenas prácticas …• En bundles compartidos (públicos o

privados).

Page 22: Las buenas prácticas oficiales para aplicaciones Symfony

No uses las buenas prácticas …• En bundles compartidos (públicos o

privados).• En aplicaciones muy complejas o con

arquitecturas muy especiales.

Page 23: Las buenas prácticas oficiales para aplicaciones Symfony

No uses las buenas prácticas …• En bundles compartidos (públicos o

privados).• En aplicaciones muy complejas o con

arquitecturas muy especiales.• Si tienes tus propias buenas prácticas.

Page 24: Las buenas prácticas oficiales para aplicaciones Symfony

Aplicaciones vs bundles

Page 25: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de una aplicación webproyecto/

!" app/ # !" config/ # $" Resources/ # $" views/ !" src/ !" vendor/ $" web/ !" css/ $" js/

Page 26: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de una aplicación web

configuración

proyecto/

!" app/ # !" config/ # $" Resources/ # $" views/ !" src/ !" vendor/ $" web/ !" css/ $" js/

Page 27: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de una aplicación web

configuración

plantillas

proyecto/

!" app/ # !" config/ # $" Resources/ # $" views/ !" src/ !" vendor/ $" web/ !" css/ $" js/

Page 28: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de una aplicación web

configuración

plantillas

tu código

proyecto/

!" app/ # !" config/ # $" Resources/ # $" views/ !" src/ !" vendor/ $" web/ !" css/ $" js/

Page 29: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de una aplicación web

configuración

plantillas

tu código

dependencias

proyecto/

!" app/ # !" config/ # $" Resources/ # $" views/ !" src/ !" vendor/ $" web/ !" css/ $" js/

Page 30: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de una aplicación web

configuración

plantillas

tu código

dependencias

assets

proyecto/

!" app/ # !" config/ # $" Resources/ # $" views/ !" src/ !" vendor/ $" web/ !" css/ $" js/

Page 31: Las buenas prácticas oficiales para aplicaciones Symfony

¿Cómo crear un sistema de plugins?

Page 32: Las buenas prácticas oficiales para aplicaciones Symfony

¿Cómo crear un sistema de plugins?• Deben funcionar de manera autónoma.

Page 33: Las buenas prácticas oficiales para aplicaciones Symfony

¿Cómo crear un sistema de plugins?• Deben funcionar de manera autónoma.

• Pueden definir su propia configuración.

Page 34: Las buenas prácticas oficiales para aplicaciones Symfony

¿Cómo crear un sistema de plugins?• Deben funcionar de manera autónoma.

• Pueden definir su propia configuración.

• Pueden incluir plantillas y assets.

Page 35: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de un pluginplugin/

!" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

Page 36: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de un plugin

configuraciónplugin/

!" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

Page 37: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de un plugin

configuración

assets

plugin/

!" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

Page 38: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de un plugin

configuración

plantillas

assets

plugin/

!" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

Page 39: Las buenas prácticas oficiales para aplicaciones Symfony

Estructura de un plugin

configuración

plantillas

tu código

assets

plugin/

!" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

Page 40: Las buenas prácticas oficiales para aplicaciones Symfony

proyecto/

!" app/ # !" config/ # $" Resources/ # $" views/ !" src/ !" vendor/ $" web/ !" css/ $" js/

Aplicaciones vs plugins/bundlesbundle/

!" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

Page 41: Las buenas prácticas oficiales para aplicaciones Symfony

Los bundles son mini-aplicaciones

Configuración Plantillas Código!fuente Assets Contenedor

servicios Kernel Caché!y logs

Aplicación ✔ ✔ ✔ ✔ ✔ ✔ ✔

Bundle ✔ ✔ ✔ ✔ ✔ ✘ ✘

Page 42: Las buenas prácticas oficiales para aplicaciones Symfony

proyecto/ !" app/ # !" config/ # $" Resources/ # $" views/ !" src/ # # # # # # !" vendor/ $" web/ !" css/ $" js/

Los bundles en aplicaciones privadas

AcmeUserBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

AcmeProductBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

AcmeOfferBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

AcmeInvoiceBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

Page 43: Las buenas prácticas oficiales para aplicaciones Symfony

proyecto/ !" app/ # !" config/ # $" Resources/ # $" views/ !" src/ # # # # # # !" vendor/ $" web/ !" css/ $" js/

Los bundles en aplicaciones privadas

AcmeUserBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

AcmeProductBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

AcmeOfferBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

AcmeInvoiceBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

Page 44: Las buenas prácticas oficiales para aplicaciones Symfony

proyecto/ !" app/ # !" config/ # $" Resources/ # $" views/ !" src/ # # # # # # !" vendor/ $" web/ !" css/ $" js/

Los bundles en aplicaciones privadas

AcmeUserBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

AcmeProductBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

AcmeOfferBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

AcmeInvoiceBundle/ !" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...

Page 45: Las buenas prácticas oficiales para aplicaciones Symfony

Una verdad incómoda

Es muy probable que los bundles de tus aplicaciones no sean bundles, sólo directorios que molestan.

Page 46: Las buenas prácticas oficiales para aplicaciones Symfony

Buenas prácticas en la práctica

Page 47: Las buenas prácticas oficiales para aplicaciones Symfony

Organizando el proyecto

Seguridad

Anotaciones

Simplificaciones

Page 48: Las buenas prácticas oficiales para aplicaciones Symfony

Organizando el proyecto

Seguridad

Anotaciones

Simplificaciones

Page 49: Las buenas prácticas oficiales para aplicaciones Symfony

Crea un solo bundle llamado AppBundle

Page 50: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Controller/ # # $" DefaultController.php # !" PaymentBundle/ # # $" Controller/ # # $" DefaultController.php # !" ProductBundle/ # # $" Controller/ # # $" DefaultController.php # $" UserBundle/ # $" Controller/ # $" DefaultController.php !" vendor/ $" web/

aplicacion/ !" app/ !" src/ # $" AppBundle/ # $" Controller/ # !" ContactController.php # !" PaymentController.php # !" ProductController.php # $" UserController.php !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

Page 51: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Controller/ # # $" DefaultController.php # !" PaymentBundle/ # # $" Controller/ # # $" DefaultController.php # !" ProductBundle/ # # $" Controller/ # # $" DefaultController.php # $" UserBundle/ # $" Controller/ # $" DefaultController.php !" vendor/ $" web/

aplicacion/ !" app/ !" src/ # $" AppBundle/ # $" Controller/ # !" ContactController.php # !" PaymentController.php # !" ProductController.php # $" UserController.php !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

8 directorios

4 archivos

Page 52: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Controller/ # # $" DefaultController.php # !" PaymentBundle/ # # $" Controller/ # # $" DefaultController.php # !" ProductBundle/ # # $" Controller/ # # $" DefaultController.php # $" UserBundle/ # $" Controller/ # $" DefaultController.php !" vendor/ $" web/

aplicacion/ !" app/ !" src/ # $" AppBundle/ # $" Controller/ # !" ContactController.php # !" PaymentController.php # !" ProductController.php # $" UserController.php !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

8 directorios

4 archivos

2 directorios

4 archivos

Page 53: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Controller/ # # $" DefaultController.php # !" PaymentBundle/ # # $" Controller/ # # $" DefaultController.php # !" ProductBundle/ # # $" Controller/ # # $" DefaultController.php # $" UserBundle/ # $" Controller/ # $" DefaultController.php !" vendor/ $" web/

aplicacion/ !" app/ !" src/ # $" AppBundle/ # $" Controller/ # !" ContactController.php # !" PaymentController.php # !" ProductController.php # $" UserController.php !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

Page 54: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Controller/ # # $" DefaultController.php # !" PaymentBundle/ # # $" Controller/ # # $" DefaultController.php # !" ProductBundle/ # # $" Controller/ # # $" DefaultController.php # $" UserBundle/ # $" Controller/ | !" GroupController.php | !" ProfileController.php | !" RegistrationController.php | !" ResettingController.php | $" SecurityController.php !" vendor/ $" web/

aplicacion/ !" app/ !" src/ # $" AppBundle/ # $" Controller/ # !" ContactController.php # !" PaymentController.php # !" ProductController.php # $" User/ | !" GroupController.php | !" ProfileController.php | !" RegistrationController.php | !" ResettingController.php | $" SecurityController.php !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

Page 55: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Controller/ # # $" DefaultController.php # !" PaymentBundle/ # # $" Controller/ # # $" DefaultController.php # !" ProductBundle/ # # $" Controller/ # # $" DefaultController.php # $" UserBundle/ # $" Controller/ | !" GroupController.php | !" ProfileController.php | !" RegistrationController.php | !" ResettingController.php | $" SecurityController.php !" vendor/ $" web/

aplicacion/ !" app/ !" src/ # $" AppBundle/ # $" Controller/ # !" ContactController.php # !" PaymentController.php # !" ProductController.php # $" User/ | !" GroupController.php | !" ProfileController.php | !" RegistrationController.php | !" ResettingController.php | $" SecurityController.php !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

8 directorios

8 archivos

Page 56: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Controller/ # # $" DefaultController.php # !" PaymentBundle/ # # $" Controller/ # # $" DefaultController.php # !" ProductBundle/ # # $" Controller/ # # $" DefaultController.php # $" UserBundle/ # $" Controller/ | !" GroupController.php | !" ProfileController.php | !" RegistrationController.php | !" ResettingController.php | $" SecurityController.php !" vendor/ $" web/

aplicacion/ !" app/ !" src/ # $" AppBundle/ # $" Controller/ # !" ContactController.php # !" PaymentController.php # !" ProductController.php # $" User/ | !" GroupController.php | !" ProfileController.php | !" RegistrationController.php | !" ResettingController.php | $" SecurityController.php !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

8 directorios

8 archivos

3 directorios

8 archivos

Page 57: Las buenas prácticas oficiales para aplicaciones Symfony

Configuración del enrutamiento# app/config/routing.yml app: resource: @AppBundle/Controller/ type: annotation

Page 58: Las buenas prácticas oficiales para aplicaciones Symfony

No añadas un vendor en los bundles que no compartas

Page 59: Las buenas prácticas oficiales para aplicaciones Symfony

No añadas un vendor a los bundles privadosAcmeNetworksAcmeWebsiteMarketingBundle !

AcmeNetworksAcmeWebsiteMarketingBundle:Default:index.html.twig

!

{{ render(controller( 'AcmeNetworksAcmeWebsiteMarketingBundle:Default:latestNews' )) }}

Page 60: Las buenas prácticas oficiales para aplicaciones Symfony

No añadas un vendor a los bundles privadosAcmeNetworksAcmeWebsiteMarketingBundle !

AcmeNetworksAcmeWebsiteMarketingBundle:Default:index.html.twig

!

{{ render(controller( 'AcmeNetworksAcmeWebsiteMarketingBundle:Default:latestNews' )) }}

Esto lo he visto con mis propios ojos

Page 61: Las buenas prácticas oficiales para aplicaciones Symfony

Guarda todas tus plantillas en app/

Page 62: Las buenas prácticas oficiales para aplicaciones Symfony

Esta buena práctica es la que produce un

mayor impacto positivo

AVISO IMPORTANTE

Page 63: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Resources/ # # $" views/ # # $" Default/ # # !" index.html.twig # # $" show.html.twig # . . . # $" ProductBundle/ # $" Resources/ # $" views/ # $" Default/ # !" index.html.twig # !" category.html.twig # $" show.html.twig !" vendor/ $" web/

your-application/ !" app/ # $" Resources/ # $" views/ # !" contact/ # # !" index.html.twig # # $" show.html.twig # . . . # $" product/ # !" index.html.twig # !" category.html.twig # $" show.html.twig !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

Page 64: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Resources/ # # $" views/ # # $" Default/ # # !" index.html.twig # # $" show.html.twig # . . . # $" ProductBundle/ # $" Resources/ # $" views/ # $" Default/ # !" index.html.twig # !" category.html.twig # $" show.html.twig !" vendor/ $" web/

your-application/ !" app/ # $" Resources/ # $" views/ # !" contact/ # # !" index.html.twig # # $" show.html.twig # . . . # $" product/ # !" index.html.twig # !" category.html.twig # $" show.html.twig !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

8 directorios

5 archivos

Page 65: Las buenas prácticas oficiales para aplicaciones Symfony

aplicacion/ !" app/ !" src/ # !" ContactBundle/ # # $" Resources/ # # $" views/ # # $" Default/ # # !" index.html.twig # # $" show.html.twig # . . . # $" ProductBundle/ # $" Resources/ # $" views/ # $" Default/ # !" index.html.twig # !" category.html.twig # $" show.html.twig !" vendor/ $" web/

your-application/ !" app/ # $" Resources/ # $" views/ # !" contact/ # # !" index.html.twig # # $" show.html.twig # . . . # $" product/ # !" index.html.twig # !" category.html.twig # $" show.html.twig !" vendor/ $" web/

Aplicaciones Symfony tradicionales Buenas Prácticas oficiales

8 directorios

5 archivos

4 directorios

5 archivos

Page 66: Las buenas prácticas oficiales para aplicaciones Symfony

Centralizar las plantillas

Page 67: Las buenas prácticas oficiales para aplicaciones Symfony

Centralizar las plantillas

Cambia la vida a tus diseñadores/as

Page 68: Las buenas prácticas oficiales para aplicaciones Symfony

Centralizar las plantillas

Cambia la vida a tus diseñadores/as

Simplifica mucho tu código

Page 69: Las buenas prácticas oficiales para aplicaciones Symfony

Nueva organización de plantillasaplicacion/

$" app/Resources/views/ !" contact/ # !" index.html.twig # $" show.html.twig . . . !

$" product/ !" index.html.twig !" category.html.twig $" show.html.twig

Page 70: Las buenas prácticas oficiales para aplicaciones Symfony

La nueva notación de las plantillas$this->render('AcmeDemoBunde:Default:index.html.twig'); $this->render('default/index.html.twig'); !

$this->render('AcmeDemoBundle::index.html.twig'); $this->render('index.html.twig');

Page 71: Las buenas prácticas oficiales para aplicaciones Symfony

La nueva notación de las plantillas{% extends '::layout.html.twig' %} {% extends 'layout.html.twig' %} !

{{ include('AcmeDemoBundle:Default:subdir/index.html.twig') }} {{ include('default/subdir/index.html.twig') }} !

{{ include('AcmeDemoBundle:Default/subdir:index.html.twig') }} {{ include('default/subdir/index.html.twig') }}

Page 72: Las buenas prácticas oficiales para aplicaciones Symfony

Los problemas de la notación tradicionalAcmeDemoBundle:Default:subdir/index.html.twig

Page 73: Las buenas prácticas oficiales para aplicaciones Symfony

Los problemas de la notación tradicional

• Requiere explicársela a cada diseñador/programador.

AcmeDemoBundle:Default:subdir/index.html.twig

Page 74: Las buenas prácticas oficiales para aplicaciones Symfony

Los problemas de la notación tradicional

• Requiere explicársela a cada diseñador/programador.

• Tiene excepciones (alguna de sus partes puede estar vacía) e inconsistencias (subdirectorios).

AcmeDemoBundle:Default:subdir/index.html.twig

Page 75: Las buenas prácticas oficiales para aplicaciones Symfony

Los problemas de la notación tradicional

• Requiere explicársela a cada diseñador/programador.

• Tiene excepciones (alguna de sus partes puede estar vacía) e inconsistencias (subdirectorios).

• No es inmediato saber dónde está la plantilla (debes traducir la notación a un directorio).

AcmeDemoBundle:Default:subdir/index.html.twig

Page 76: Las buenas prácticas oficiales para aplicaciones Symfony

Guarda todos tus assets en web/

Page 77: Las buenas prácticas oficiales para aplicaciones Symfony

Centralizar los assets (CSS, JavaScript)• Tiene las mismas ventajas que centralizar

las plantillas.

Page 78: Las buenas prácticas oficiales para aplicaciones Symfony

Organizando los assets webproyecto/ !" app/ !" src/ !" vendor/ $" web/ !" css/ # !" bootstrap.min.css # $" app.css $" js/ !" jquery.min.js $" app.js

Page 79: Las buenas prácticas oficiales para aplicaciones Symfony

Organizando los assets webproyecto/ !" app/ !" src/ !" vendor/ $" web/ !" css/ # !" bootstrap.min.css # $" app.css $" js/ !" jquery.min.js $" app.js

proyecto/ !" app/ # $" Resources/ # $" assets/ # !" scss/ # # !" bootstrap/ # # $" app.scss # $" js/ !" src/ !" vendor/ $" web/ !" css/app.css $" js/app.js

Page 80: Las buenas prácticas oficiales para aplicaciones Symfony

En resumen• Si utilizas mal los bundles, estás repitiendo

la estructura de la aplicación sin necesidad • Si no vas a compartir tus bundles, utiliza

los directorios de la aplicación (app/Resources/ y web/).

• El número de archivos se mantiene, los directorios y la complejidad se reducen.

Page 81: Las buenas prácticas oficiales para aplicaciones Symfony

Organizando el proyecto

Seguridad

Anotaciones

Simplificaciones

Page 82: Las buenas prácticas oficiales para aplicaciones Symfony

Escala de sensibilidad para programadores

Page 83: Las buenas prácticas oficiales para aplicaciones Symfony

Escala de sensibilidad para programadores

Política

Religión

Fútbol

Estándar de código

Editor de código

Anotaciones

Page 84: Las buenas prácticas oficiales para aplicaciones Symfony

Anotaciones PHPuse AppBundle\Entity\Post; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; !

class CommentController extends Controller { /** * @Route("/edit/{id}", name = "post_edit") */ public function editAction(Post $post) { ... } !

/* * @Route("/edit/{id}", name = "post_edit") */ public function editAction(Post $post) { ... } }

Page 85: Las buenas prácticas oficiales para aplicaciones Symfony

Anotaciones PHPuse AppBundle\Entity\Post; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; !

class CommentController extends Controller { /** * @Route("/edit/{id}", name = "post_edit") */ public function editAction(Post $post) { ... } !

/* * @Route("/edit/{id}", name = "post_edit") */ public function editAction(Post $post) { ... } }

Anotación

Page 86: Las buenas prácticas oficiales para aplicaciones Symfony

Anotaciones PHPuse AppBundle\Entity\Post; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; !

class CommentController extends Controller { /** * @Route("/edit/{id}", name = "post_edit") */ public function editAction(Post $post) { ... } !

/* * @Route("/edit/{id}", name = "post_edit") */ public function editAction(Post $post) { ... } }

Anotación

Comentario

Page 87: Las buenas prácticas oficiales para aplicaciones Symfony

Anotaciones PHP

/** @Route(...) */Anotación

Comentario /* @Route(...) */

Page 88: Las buenas prácticas oficiales para aplicaciones Symfony

Utiliza @Route, @Security y @Cache

Page 89: Las buenas prácticas oficiales para aplicaciones Symfony

Enrutamiento tradicional# app/config/routing.yml _admin_post: resource: '@AcmeAdminBundle/Resources/config/routing/post.yml' prefix: '/admin/post' !

# src/Acme/AdminBundle/Resources/config/routing/post.yml admin_post_show: pattern: '/{id}' defaults: { _controller: 'AcmeAdminBundle:Post:show' } !

!

namespace Acme\AdminBundle\Controller; !

class PostController { public function showAction($id) { ... } }

Page 90: Las buenas prácticas oficiales para aplicaciones Symfony

Enrutamiento con anotacionesnamespace AppBundle\Controller\Admin; !

use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; !

/** * @Route("/admin/post") */ class PostController extends Controller { /** * @Route("/{id}", name="admin_post_show") */ public function showAction($id) { ... } }

Page 91: Las buenas prácticas oficiales para aplicaciones Symfony

No utilices la anotación @Template

Page 92: Las buenas prácticas oficiales para aplicaciones Symfony

La anotación @Template es mágica/** @Template() */ public function indexAction() { // ... return array('posts' => $posts); } !

!

public function indexAction() { // ... return $this->render('blog/index.html.twig', array( 'posts' => $posts )); }

Page 93: Las buenas prácticas oficiales para aplicaciones Symfony

Utiliza los ParamConverter cuando sea sencillo

Page 94: Las buenas prácticas oficiales para aplicaciones Symfony

Los ParamConvertes en la prácticause Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use AppBundle\Entity\Post;

!class CommentController extends Controller { /** * @Route("/edit/{id}", name = "post_edit") */ public function editAction(Post $post) { } }

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; !!class CommentController extends Controller { /** * @Route("/edit/{id}", name = "post_edit") */ public function editAction($id) { $em = $this->getDoctrine()->getManager(); $post = $em->getRepository('AppBundle:Post')->find($id); ! if (!$post) { throw $this->createNotFoundException(); } } }

Page 95: Las buenas prácticas oficiales para aplicaciones Symfony

Un controlador Symfony de ejemplonamespace AppBundle\Controller; !use AppBundle\Entity\Post; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

!

class BlogController extends Controller { /** * @Route("/edit/{id}", name="post_edit") */ public function editAction(Post $post) { return $this->render('blog/edit.html.twig', array( 'post' => $post )); } }

Page 96: Las buenas prácticas oficiales para aplicaciones Symfony

Nuestro consejo

DESACOPLA ACOPLAla

lógica de negociolos

controladores

Page 97: Las buenas prácticas oficiales para aplicaciones Symfony

Los atajos de los controladores$this->forward();

$this->redirect();

$this->redirectToRoute();

$this->getUser();

$this->getDoctrine();

$this->generateUrl();

$this->createNotFoundException();

$this->createAccessDeniedException()

Page 98: Las buenas prácticas oficiales para aplicaciones Symfony

Organizando el proyecto

Seguridad

Anotaciones

Simplificaciones

Page 99: Las buenas prácticas oficiales para aplicaciones Symfony

Utiliza bcrypt para codificar las contraseñas

Page 100: Las buenas prácticas oficiales para aplicaciones Symfony

Combina varios sistemas de autorización

Page 101: Las buenas prácticas oficiales para aplicaciones Symfony

Restricciones poco granulares# app/config/security.yml security: encoders: # ... !

providers: # ... !

firewalls: # ... !

access_control: - { path: ^/admin, roles: ROLE_ADMIN }

Page 102: Las buenas prácticas oficiales para aplicaciones Symfony

Restricciones sencillas y comunesuse Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; !

/** * @Route("/new", name="admin_post_new") * @Security("has_role('ROLE_ADMIN')") */ public function newAction() { // ... }

Page 103: Las buenas prácticas oficiales para aplicaciones Symfony

Restricciones sencillas y comunesuse Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; !

/** * @Route("/new", name="admin_post_new") */ public function newAction() { if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) { throw $this->createAccessDeniedException(); } !! // ... }

Page 104: Las buenas prácticas oficiales para aplicaciones Symfony

Restricciones sencillas y comunesuse AppBundle\Entity\Post; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; !

/** * @Route("/{id}/edit", name="admin_post_edit") * @Security("user.getEmail() == post.getAuthorEmail()") */ public function editAction(Post $post) { // ... }

Page 105: Las buenas prácticas oficiales para aplicaciones Symfony

Restricciones sencillas y comunes// src/AppBundle/Entity/Post.php // ... !

class Post { // ... !

public function isAuthor(User $user = null) { return $user && $user->getEmail() == $this->getAuthorEmail(); } }

Page 106: Las buenas prácticas oficiales para aplicaciones Symfony

Restricciones sencillas y comunesuse AppBundle\Entity\Post; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; !

/** * @Route("/{id}/edit", name="admin_post_edit") * @Security("post.isAuthor(user)") */ public function editAction(Post $post) { // ... } !

!

{% if post.isAuthor(app.user) %} <a href=""> ... </a> {% endif %}

Page 107: Las buenas prácticas oficiales para aplicaciones Symfony

Restricciones avanzadas (voters)namespace AppBundle\Security; !use Symfony\Component\Security\Core\Authorization\Voter\AbstractVoter; use Symfony\Component\Security\Core\User\UserInterface; !class PostVoter extends AbstractVoter { protected function getSupportedAttributes() { return array('create', 'edit'); } ! protected function getSupportedClasses() { return array('AppBundle\Entity\Post'); } ! protected function isGranted($attribute, $post, $user = null) { // ... } }

Page 108: Las buenas prácticas oficiales para aplicaciones Symfony

Organizando el proyecto

Seguridad

Anotaciones

Simplificaciones

Page 109: Las buenas prácticas oficiales para aplicaciones Symfony

Nombres de servicios en apps Symfony// Servicios Symfony $this->get('doctrine') $this->get('logger') $this->get('session') $this->get('validator') !

// Servicios de terceros $this->get('imagine.filter.loader.thumbnail') $this->get('knp_menu.renderer_provider') $this->get('sonata.admin.form.filter.type.datetime_range')

Page 110: Las buenas prácticas oficiales para aplicaciones Symfony

Nombres de servicios propios$this->get('slugger') $this->get('parser') $this->get('markdown_parser') $this->get('stats_aggregator') !

// Aceptable también $this->get('app.slugger') $this->get('app.parser') $this->get('app.markdown_parser') $this->get('app.stats_aggregator')

Page 111: Las buenas prácticas oficiales para aplicaciones Symfony

No definas parámetros para las clases# app/config/services.yml parameters: slugger.class: AppBundle\Utils\Slugger !

services: slugger: class: "%slugger.class%"

Page 112: Las buenas prácticas oficiales para aplicaciones Symfony

No definas parámetros para las clases# app/config/services.yml parameters: slugger.class: AppBundle\Utils\Slugger !

services: slugger: class: "%slugger.class%"

Innecesario y poco útil en la

práctica

Page 113: Las buenas prácticas oficiales para aplicaciones Symfony

No definas parámetros que no cambian# app/config/config.yml parameters: homepage.num_items: 10 !

// src/AppBundle/Entity/Post.php class Post { const NUM_ITEMS = 10; !

// ... }

Page 114: Las buenas prácticas oficiales para aplicaciones Symfony

No definas parámetros que no cambian# app/config/config.yml parameters: homepage.num_items: 10 !

// src/AppBundle/Entity/Post.php class Post { const NUM_ITEMS = 10; !

// ... }

Este valor seguramente no cambia nunca

Page 115: Las buenas prácticas oficiales para aplicaciones Symfony

No añadas botones en los formulariosclass PostType extends AbstractType {

public function buildForm($builder, $options) {

$builder

// ...

->add('save', 'submit', array('label' => 'Create Post'))

;

}

!

// ...

}

Page 116: Las buenas prácticas oficiales para aplicaciones Symfony

No añadas botones en los formulariosclass PostType extends AbstractType {

public function buildForm($builder, $options) {

$builder

// ...

->add('save', 'submit', array('label' => 'Create Post'))

;

}

!

// ...

}

Te dificulta reutilizar los formularios

Page 117: Las buenas prácticas oficiales para aplicaciones Symfony

No utilices form_start y form_end<form method="post" {{ form_enctype(form) }}>

{{ form_widget(form) }}

!

<input type="submit" value="Create"

class="btn btn-default pull-right" />

</form>

Page 118: Las buenas prácticas oficiales para aplicaciones Symfony

No generes las URLs en los testspublic function testBlogArchives() { $client = self::createClient(); $url = $client->getContainer()->get('router')->generate('blog_archives'); $client->request('GET', $url); // ... } !

!

public function testBlogArchives() { $client = self::createClient(); $client->request('GET', '/blog/archives/'); // ... }

Page 119: Las buenas prácticas oficiales para aplicaciones Symfony

No generes las URLs en los testspublic function testBlogArchives() { $client = self::createClient(); $url = $client->getContainer()->get('router')->generate('blog_archives'); $client->request('GET', $url); // ... } !

!

public function testBlogArchives() { $client = self::createClient(); $client->request('GET', '/blog/archives/'); // ... }

Si rompes la URL no te enteras

Page 120: Las buenas prácticas oficiales para aplicaciones Symfony

Configuraciónproyecto/app/config/

!" config.yml !" parameters.yml $" parameters.yml.dist

Page 121: Las buenas prácticas oficiales para aplicaciones Symfony

Configuración

no cambia de un ordenador a otro

proyecto/app/config/

!" config.yml !" parameters.yml $" parameters.yml.dist

Page 122: Las buenas prácticas oficiales para aplicaciones Symfony

Configuración

no cambia de un ordenador a otro

cambia de un ordenador a otro no se sube al repositorio

proyecto/app/config/

!" config.yml !" parameters.yml $" parameters.yml.dist

Page 123: Las buenas prácticas oficiales para aplicaciones Symfony

Configuración

no cambia de un ordenador a otro

cambia de un ordenador a otro no se sube al repositorio

este sí se sube al repositorio

proyecto/app/config/

!" config.yml !" parameters.yml $" parameters.yml.dist

Page 124: Las buenas prácticas oficiales para aplicaciones Symfony

No utilices una configuración semánticapublic function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('framework'); ! $rootNode ->children() ->scalarNode('secret')->end() ->scalarNode('http_method_override') ->info("Set true to enable support for ...”) ->defaultTrue() ->end() ->arrayNode('trusted_proxies') ->beforeNormalization() ->ifTrue(function ($v) { return !is_array($v) && null !== $v; }) ->then(function ($v) { return is_bool($v) ? array() : preg_split('/\s*,\s*/', $v); }) ->end() ->prototype('scalar') ->validate() ->ifTrue(function ($v) { if (empty($v)) { return false; } ! if (false !== strpos($v, '/')) {

Sólo es útil en configuraciones muy complejas

Page 125: Las buenas prácticas oficiales para aplicaciones Symfony

Conclusiones

Page 126: Las buenas prácticas oficiales para aplicaciones Symfony

Conjunto de técnicas que puedes utilizar para desarrollar aplicaciones Symfony como recomiendan sus creadores.

Page 127: Las buenas prácticas oficiales para aplicaciones Symfony

Todo es opcional y no es necesario utilizar todas las buenas prácticas a la vez.

Page 128: Las buenas prácticas oficiales para aplicaciones Symfony

Estas buenas prácticas no sirven en algunos proyectos

y escenarios concretos.

Page 129: Las buenas prácticas oficiales para aplicaciones Symfony

Aunque no las sigas, te pueden servir para crear tus propias buenas prácticas.

Page 130: Las buenas prácticas oficiales para aplicaciones Symfony

Nadie conoce tu trabajo y tus circunstancias como tu. Por eso las mejores buenas prácticas

son tus buenas prácticas.

Page 131: Las buenas prácticas oficiales para aplicaciones Symfony

Muchas gracias.

Page 132: Las buenas prácticas oficiales para aplicaciones Symfony

¿Preguntas, comentarios?

Page 133: Las buenas prácticas oficiales para aplicaciones Symfony

SensioLabs