deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

2,796 views

Published on

Annotations es una forma de configurar Symfony y los componentes que lo rodean que está en auge. Y ya que estamos podemos crear nuestras propias anotaciones para configurar nuestros Bundles, componentes, servicios, etc.

La idea es mostrar las anotaciones que nos proporciona Symfony y hacer un pequeño workshop de como crear nuestras propias anotaciones.

1 Comment
3 Likes
Statistics
Notes
  • El video de la charla en:

    http://www.youtube.com/watch?feature=player_embedded&v=r4iMO3KiTxg
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
2,796
On SlideShare
0
From Embeds
0
Number of Embeds
1,166
Actions
Shares
0
Downloads
48
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide

deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

  1. 1. #deSymfony @aferrandini
  2. 2. NO HABLARÉ DE COMIDA#deSymfony @aferrandini
  3. 3. #deSymfony @aferrandini¿QUIÉN SOY?•Ariel Ferrandini Price (11-11-85)•Programador PHP•Symfony lover (0.9.8beta)•DeSymfony early adopter•¡Me encanta viajar!
  4. 4. ORIGEN DE LAS ANOTACIONESanotación1. nota crítica o explicatoria agregados a un texto.Java 1.5, especificación JSR-175 en 2002 y aprobadas en septiembre de 2004.Las anotaciones no afectan directamente a la semántica del programa, pero afectan ala forma en que los programas son tratados por herramientas y bibliotecas, que a su vezpueden afectar a la semántica del programa en ejecución. Las anotaciones se pueden leeren clases mediante reflexión en tiempo de ejecución.#deSymfony @aferrandini
  5. 5. #deSymfony @aferrandini¿Qué diceeste loco?
  6. 6. Request¿Cómo funcionan las anotaciones?#deSymfony @aferrandiniFrontControllerSymfony KernelEventos
  7. 7. ¿Cómo funcionan las anotaciones?#deSymfony @aferrandiniReaderDriver Semántica@AnnotationControllerFoo()@AnnotationActionFoo()<?phpnamespace NamespaceFoo;use AnnotationFoo;/*** @AnnotationControllerFoo()*/class Controller{/*** @AnnotationActionFoo()*/public function fooAction(){// ...}}
  8. 8. ¿Cómo funcionan las anotaciones?Response#deSymfony @aferrandini
  9. 9. ANOTACIONESEN#deSymfony @aferrandini
  10. 10. FRAMEWORK EXTRA BUNDLE# app/config/config.ymlsensio_framework_extra:router: { annotations: true }request: { converters: true }view: { annotations: true }cache: { annotations: true }Habilitar las anotaciones
  11. 11. FRAMEWORK EXTRA BUNDLEAgregar las anotaciones con useuse SensioBundleFrameworkExtraBundleConfigurationRoute;use SensioBundleFrameworkExtraBundleConfigurationMethod;use SensioBundleFrameworkExtraBundleConfigurationParamConverter;use SensioBundleFrameworkExtraBundleConfigurationCache;use SensioBundleFrameworkExtraBundleConfigurationTemplate;
  12. 12. ENRUTAMIENTO# app/config/routing.yml# importar rutas de una clase Controlleragenda:resource: "@DeSymfonyWebBundle/Controller/AgendaController.php"type: annotation# importar todas las clases Controller de un directorioweb:resource: "@DeSymfonyWebBundle/Controller"type: annotationActivar rutas con anotaciones
  13. 13. ENRUTAMIENTO@Route @Method#deSymfony @aferrandini
  14. 14. @ROUTE// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/”, name=”agenda”)*/public function agendaAction(){}}Configurar rutas con anotaciones
  15. 15. @ROUTEConfigurar rutas con anotaciones// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{dia}”, name=”agenda”)*/public function agendaAction($dia){}}
  16. 16. @ROUTE// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{dia}”, name=”agenda”,requirements={“dia”=”d+”}, defaults={“dia”=21})*/public function agendaAction($dia){}}
  17. 17. ROUTING@Route @Method#deSymfony @aferrandini
  18. 18. @METHOD// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/editar/{id}”, name=”editar_agenda”)* @Method({“GET”, “POST”})*/public function editarAction($id){}}Configurar método con anotaciones
  19. 19. CONVERSORES@ParamConverter#deSymfony @aferrandini
  20. 20. @PARAMCONVERTER// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{id}”, name=”agenda”)* @ParamConverter(“agenda”, class=”DeSymfonyWebBundle:Agenda”)*/public function agendaAction(Agenda $agenda){}}Convierte parámetros en objetos
  21. 21. // DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{id}”, name=”agenda”)* @ParamConverter(“agenda”, class=”DeSymfonyWebBundle:Agenda”,options={“entity_manager” = “foo”)*/public function agendaAction(Agenda $agenda){}@PARAMCONVERTERConvierte parámetros en objetos
  22. 22. // DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{id}/{agenda_id}”, name=”agenda”)* @ParamConverter(“agenda”, class=”DeSymfonyWebBundle:Agenda”,options={“id” = “agenda_id”)*/public function agendaAction(Agenda $agenda){}@PARAMCONVERTERConvierte parámetros en objetos
  23. 23. // DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{slug}”, name=”agenda”)* @ParamConverter(“agenda”, class=”DeSymfonyWebBundle:Agenda”,options={“mapping”: {“slug”: “slug”}})*/public function agendaAction(Agenda $agenda){}@PARAMCONVERTERConvierte parámetros en objetos
  24. 24. // DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{inicio}/{fin}”, name=”agenda”)* @ParamConverter(“inicio”, options={“format”: “Y-m-d”})* @ParamConverter(“fin”, options={“format”: “Y-m-d”})*/public function agendaAction(DateTime $inicio, DateTime $fin){}@PARAMCONVERTERConvierte parámetros en objetos
  25. 25. CACHE@Cache#deSymfony @aferrandini
  26. 26. @CACHE// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Cache(expires=”tomorrow”)*/class AgendaController extends Controller{/*** @Cache(expires=”+5 days”)*/public function indexAction(){}}Establece la cache de Response
  27. 27. @Cache(expires=”tomorrow”)@Cache(smaxage=”15”)@Cache(maxage=”15”)@Cache(vary=[”Cookie”])$response->setExpires()$response->setSharedMaxAge()$response->setMaxAge()$response->setVary()@CACHEEstablece la cache de Response
  28. 28. VISTA@Template#deSymfony @aferrandini
  29. 29. @TEMPLATEAsocia un método acción con una plantilla// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/”, name=”agenda”)* @Template(“DeSymfonyWebBundle:Agenda:agenda.html.twig”)*/public function agendaAction(){}}
  30. 30. // DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/”, name=”agenda”)* @Template*/public function agendaAction(){}}@TEMPLATEAsocia un método acción con una plantilla
  31. 31. // DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{id}”, name=”agenda”)* @ParamConverter(“agenda”, class=”DeSymfonyWebBundle:Agenda”)* @Template(“DeSymfonyWebBundle:Agenda:agenda.html.twig”, vars={“agenda”})*/public function agendaAction(Agenda $agenda){}@TEMPLATEAsocia un método acción con una plantilla
  32. 32. // DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{id}”, name=”agenda”)* @ParamConverter(“agenda”, class=”DeSymfonyWebBundle:Agenda”)* @Template(vars={“agenda”})*/public function agendaAction(Agenda $agenda){}@TEMPLATEAsocia un método acción con una plantilla
  33. 33. // DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/{id}”, name=”agenda”)* @Template(engine=”php”)*/public function agendaAction($id){}}@TEMPLATEAsocia un método acción con una plantilla
  34. 34. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.htmlDOCTRINEhttp://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/annotations.html#deSymfony @aferrandinihttp://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/annotations-reference.htmlDoctrine CommonDoctrine ORMDoctrine ODM
  35. 35. DOCTRINE ORM@Column@Entity @Index @Id @OrderBy@Table@HasLifecycleCallbacks@ManyToOne @ManyToMany @OneToOne @OneToMany@PostLoad @PostPersist @PostRemove@PostUpdate@PrePersist @PreRemove@PreUpdate#deSymfony @aferrandini
  36. 36. DOCTRINE ORM@ColumnResult@ChangeTrackingPolicy@DiscriminatorColumn@DiscriminatorMap@EntityResult@FieldResult@GeneratedValue @InheritanceType@JoinColumns@JoinColumn@JoinTable@MappedSuperclass@NamedNativeQuery@SequenceGenerator@SqlResultSetMapping@UniqueConstraint@Version#deSymfony @aferrandini
  37. 37. SYMFONY2 ~VALIDATORuse SymfonyComponentValidatorConstraints as Assert;# app/config/config.ymlframework:validation: { enable_annotations: true }Habilitar la validación con anotaciones
  38. 38. SYMFONY2 ~VALIDATOR@AssertNotBlank@AssertBlank@AssertNotNull@AssertNull@AssertTrue@AssertFalse@AssertTypeuse SymfonyComponentValidatorConstraints as Assert;Restricciones básicashttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  39. 39. SYMFONY2 ~VALIDATOR@AssertEmail@AssertLength@AssertUrl@AssertRegex@AssertIpuse SymfonyComponentValidatorConstraints as Assert;Restricciones cadenas de textohttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  40. 40. SYMFONY2 ~VALIDATOR@AssertRange @AssertDate@AssertDateTime@AssertTimeuse SymfonyComponentValidatorConstraints as Assert;Restricciones numéricas Restricciones con fechashttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  41. 41. SYMFONY2 ~VALIDATOR@AssertEqualTo@AssertNotEqualTo@AssertIdenticalTo@AssertNotIdenticalTo@AssertLessThan@AssertLessThanOrEqual@AssertGreaterThan@AssertGreaterThanOrEqualuse SymfonyComponentValidatorConstraints as Assert;Restricciones comparativashttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  42. 42. SYMFONY2 ~VALIDATOR@AssertChoice@AssertCollection@AssertCount@AssertUniqueEntity@AssertLanguage@AssertLocale@AssertCountryuse SymfonyComponentValidatorConstraints as Assert;Restricciones de coleccioneshttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  43. 43. SYMFONY2 ~VALIDATOR@AssertFile @AssertImageuse SymfonyComponentValidatorConstraints as Assert;Restricciones de archivoshttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  44. 44. SYMFONY2 ~VALIDATOR@AssertCardScheme@AssertLuhn@AssertIban@AssertIsbn@AssertIssnuse SymfonyComponentValidatorConstraints as Assert;Restricciones bancarias y otras numéricashttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  45. 45. SYMFONY2 ~VALIDATOR@AssertCallback@AssertAll@AssertUserPassword@AssertValiduse SymfonyComponentValidatorConstraints as Assert;Otras restricciones@CustomAsserthttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  46. 46. Agregar las anotaciones con useuse JMSSecurityExtraBundleAnnotationSecure;use JMSSecurityExtraBundleAnnotationSecureParam;use JMSSecurityExtraBundleAnnotationSecureReturn;use JMSSecurityExtraBundleAnnotationRunAs;use JMSSecurityExtraBundleAnnotationSatisfiesParentSecurityPolicy;JMSSECURITYEXTRABUNDLEJohannes Schmitt
  47. 47. @Secure @SecureParamJMSSECURITYEXTRABUNDLE@SecureReturn @RunAs@SatisfiesParentSecurityPolicy#deSymfony @aferrandini
  48. 48. @SECURE// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @Route(“/editar/{id}”, name=”editar_agenda”)* @Method({“GET”, “POST”})* @Secure(roles=”ROLE_EDITOR, ROLE_ADMIN, ROLE_FOO”)*/public function editarAction($id){}Define quién puede invocar el método
  49. 49. @Secure @SecureParamJMSSECURITYEXTRABUNDLE@SecureReturn @RunAs@SatisfiesParentSecurityPolicy#deSymfony @aferrandini
  50. 50. @SECUREPARAM// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @Route(“/agenda”)*/class AgendaController extends Controller{/*** @SecureParam(name="agenda", permissions="OWNER")* @Secure(roles=”ROLE_EDITOR, ROLE_ADMIN, ROLE_FOO”)*/public function editarAction(Agenda $agenda){}}Define restricciones para los parámetros
  51. 51. @Secure @SecureParamJMSSECURITYEXTRABUNDLE@SecureReturn @RunAs@SatisfiesParentSecurityPolicy#deSymfony @aferrandini
  52. 52. @SECURERETURN// DeSymfony/Bundle/WebBundle/Services/AgendaService.phpclass AgendaService{/*** @SecureReturn(permissions=”VIEW”)*/public function agendaMethod(){return $objeto;}}Define restricciones para el valor devuelto
  53. 53. @Secure @SecureParamJMSSECURITYEXTRABUNDLE@SecureReturn @RunAs@SatisfiesParentSecurityPolicy#deSymfony @aferrandini
  54. 54. @RUNASCambia el ROL de ejecución de un métodoclass AgendaPublicService{protected $agendaPrivateService;/*** @Secure(roles=”ROLE_USER”)* @RunAs(roles=”ROLE_PRIVATE”)*/public function agendaMethod(){return $this->agendaPrivateService->agendaPrivate();}}class AgendaPrivateService{/*** @Secure(role=”ROLE_PRIVATE”)*/public function agendaPrivate(){// ...}}
  55. 55. Ejemplo de @CustomAnnotationDisableBundlehttps://github.com/aferrandini/DisableBundlePermite deshabilitar un Controlador o una Acción por tiempo y redireccionar aotra ruta.@#deSymfony @aferrandini
  56. 56. #deSymfony @aferrandiniMother of Godde lasAnotaciones
  57. 57. @IGNOREANNOTATION¡Anotación para ignorar anotaciones!// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php/*** @IgnoreAnnotation(“AnotacionQueNoExiste”)*/class AgendaController extends Controller{/*** @Route(“/”, name=”agenda”)* @Template(“DeSymfonyWebBundle:Agenda:agenda.html.twig”)* @AnotacionQueNoExiste*/public function agendaAction(){}
  58. 58. ¿PREGUNTAS?#deSymfony @aferrandini
  59. 59. Buenprovecho!
  60. 60. https://connect.sensiolabs.com/profile/aferrandiniMUCHAS GRACIAS#deSymfony@aferrandinihttps://joind.in/8849http://es.linkedin.com/in/arielferrandini https://github.com/aferrandini http://twitter.com/aferrandini

×