Las buenas prácticas oficiales para aplicaciones Symfony
-
Upload
symfonybcn -
Category
Technology
-
view
319 -
download
0
Transcript of Las buenas prácticas oficiales para aplicaciones Symfony
![Page 1: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/1.jpg)
SensioLabs
SYMFONYBUENAS PRÁCTICAS
Javier Eguiluz
![Page 2: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/2.jpg)
Symfony Barcelona
gracias a
![Page 3: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/3.jpg)
Marc Morera @mmoreram
gracias a
![Page 4: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/4.jpg)
Elcodi Symfony components based e-commerce platform
gracias a
![Page 5: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/5.jpg)
Introducción
![Page 6: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/6.jpg)
13OCTUBRE
![Page 7: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/7.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/8.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/9.jpg)
¿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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/10.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/11.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/12.jpg)
Las buenas prácticas Symfony
![Page 13: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/13.jpg)
Las buenas prácticas Symfony• Reflejan las ideas de su creador.
![Page 14: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/14.jpg)
Las buenas prácticas Symfony• Reflejan las ideas de su creador.• Son opcionales.
![Page 15: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/15.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/16.jpg)
Usa las buenas prácticas …
![Page 17: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/17.jpg)
Usa las buenas prácticas …• En proyectos pequeños y medianos.
![Page 18: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/18.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/19.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/20.jpg)
No uses las buenas prácticas …
![Page 21: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/21.jpg)
No uses las buenas prácticas …• En bundles compartidos (públicos o
privados).
![Page 22: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/22.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/23.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/24.jpg)
Aplicaciones vs bundles
![Page 25: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/25.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/26.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/27.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/28.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/29.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/30.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/31.jpg)
¿Cómo crear un sistema de plugins?
![Page 32: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/32.jpg)
¿Cómo crear un sistema de plugins?• Deben funcionar de manera autónoma.
![Page 33: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/33.jpg)
¿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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/34.jpg)
¿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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/35.jpg)
Estructura de un pluginplugin/
!" DependencyInjection/ # $" Configuration.php !" Resources/ # !" config/ # !" public/ # # !" css/ # # $" js/ # $" views/ $" ...
![Page 36: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/36.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/37.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/38.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/39.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/40.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/41.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/42.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/43.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/44.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/45.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/46.jpg)
Buenas prácticas en la práctica
![Page 47: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/47.jpg)
Organizando el proyecto
Seguridad
Anotaciones
Simplificaciones
![Page 48: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/48.jpg)
Organizando el proyecto
Seguridad
Anotaciones
Simplificaciones
![Page 49: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/49.jpg)
Crea un solo bundle llamado AppBundle
![Page 50: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/50.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/51.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/52.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/53.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/54.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/55.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/56.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/57.jpg)
Configuración del enrutamiento# app/config/routing.yml app: resource: @AppBundle/Controller/ type: annotation
![Page 58: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/58.jpg)
No añadas un vendor en los bundles que no compartas
![Page 59: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/59.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/60.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/61.jpg)
Guarda todas tus plantillas en app/
![Page 62: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/62.jpg)
Esta buena práctica es la que produce un
mayor impacto positivo
AVISO IMPORTANTE
![Page 63: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/63.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/64.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/65.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/66.jpg)
Centralizar las plantillas
![Page 67: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/67.jpg)
Centralizar las plantillas
Cambia la vida a tus diseñadores/as
![Page 68: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/68.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/69.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/70.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/71.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/72.jpg)
Los problemas de la notación tradicionalAcmeDemoBundle:Default:subdir/index.html.twig
![Page 73: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/73.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/74.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/75.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/76.jpg)
Guarda todos tus assets en web/
![Page 77: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/77.jpg)
Centralizar los assets (CSS, JavaScript)• Tiene las mismas ventajas que centralizar
las plantillas.
![Page 78: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/78.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/79.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/80.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/81.jpg)
Organizando el proyecto
Seguridad
Anotaciones
Simplificaciones
![Page 82: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/82.jpg)
Escala de sensibilidad para programadores
![Page 83: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/83.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/84.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/85.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/86.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/87.jpg)
Anotaciones PHP
/** @Route(...) */Anotación
Comentario /* @Route(...) */
![Page 88: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/88.jpg)
Utiliza @Route, @Security y @Cache
![Page 89: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/89.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/90.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/91.jpg)
No utilices la anotación @Template
![Page 92: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/92.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/93.jpg)
Utiliza los ParamConverter cuando sea sencillo
![Page 94: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/94.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/95.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/96.jpg)
Nuestro consejo
DESACOPLA ACOPLAla
lógica de negociolos
controladores
![Page 97: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/97.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/98.jpg)
Organizando el proyecto
Seguridad
Anotaciones
Simplificaciones
![Page 99: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/99.jpg)
Utiliza bcrypt para codificar las contraseñas
![Page 100: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/100.jpg)
Combina varios sistemas de autorización
![Page 101: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/101.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/102.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/103.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/104.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/105.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/106.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/107.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/108.jpg)
Organizando el proyecto
Seguridad
Anotaciones
Simplificaciones
![Page 109: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/109.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/110.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/111.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/112.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/113.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/114.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/115.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/116.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/117.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/118.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/119.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/120.jpg)
Configuraciónproyecto/app/config/
!" config.yml !" parameters.yml $" parameters.yml.dist
![Page 121: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/121.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/122.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/123.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/124.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/125.jpg)
Conclusiones
![Page 126: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/126.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/127.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/128.jpg)
Estas buenas prácticas no sirven en algunos proyectos
y escenarios concretos.
![Page 129: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/129.jpg)
Aunque no las sigas, te pueden servir para crear tus propias buenas prácticas.
![Page 130: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/130.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/131.jpg)
Muchas gracias.
![Page 132: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/132.jpg)
¿Preguntas, comentarios?
![Page 133: Las buenas prácticas oficiales para aplicaciones Symfony](https://reader033.fdocuments.es/reader033/viewer/2022052602/55a4f32d1a28ab1f188b4613/html5/thumbnails/133.jpg)
SensioLabs