Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

3,113 views

Published on

Anotaciones en Symfony.
Ponencia presentada en el Congreso DeSymfony 2013 por Ariel Ferrandini, trabajador de Paradigma Tecnologico

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,113
On SlideShare
0
From Embeds
0
Number of Embeds
237
Actions
Shares
0
Downloads
13
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

  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 ANOTACIONES anotación 1. 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 a la forma en que los programas son tratados por herramientas y bibliotecas, que a su vez pueden afectar a la semántica del programa en ejecución. Las anotaciones se pueden leer en clases mediante reflexión en tiempo de ejecución. #deSymfony @aferrandini
  5. 5. #deSymfony @aferrandini ¿Qué dice este loco?
  6. 6. Request ¿Cómo funcionan las anotaciones? #deSymfony @aferrandini FrontController Symfony Kernel Eventos
  7. 7. ¿Cómo funcionan las anotaciones? #deSymfony @aferrandini ReaderDriver Semántica @AnnotationControllerFoo() @AnnotationActionFoo() <?php namespace NamespaceFoo; use AnnotationFoo; /** * @AnnotationControllerFoo() */ class Controller { /** * @AnnotationActionFoo() */ public function fooAction() { // ... } }
  8. 8. ¿Cómo funcionan las anotaciones? Response #deSymfony @aferrandini
  9. 9. ANOTACIONES EN #deSymfony @aferrandini
  10. 10. FRAMEWORK EXTRA BUNDLE # app/config/config.yml sensio_framework_extra: router: { annotations: true } request: { converters: true } view: { annotations: true } cache: { annotations: true } Habilitar las anotaciones
  11. 11. FRAMEWORK EXTRA BUNDLE Agregar las anotaciones con use use SensioBundleFrameworkExtraBundleConfigurationRoute; use SensioBundleFrameworkExtraBundleConfigurationMethod; use SensioBundleFrameworkExtraBundleConfigurationParamConverter; use SensioBundleFrameworkExtraBundleConfigurationCache; use SensioBundleFrameworkExtraBundleConfigurationTemplate;
  12. 12. ENRUTAMIENTO # app/config/routing.yml # importar rutas de una clase Controller agenda: resource: "@DeSymfonyWebBundle/Controller/AgendaController.php" type: annotation # importar todas las clases Controller de un directorio web: resource: "@DeSymfonyWebBundle/Controller" type: annotation Activar 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. @ROUTE Configurar 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) { } @PARAMCONVERTER Convierte 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) { } @PARAMCONVERTER Convierte 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) { } @PARAMCONVERTER Convierte 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) { } @PARAMCONVERTER Convierte 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() @CACHE Establece la cache de Response
  28. 28. VISTA @Template #deSymfony @aferrandini
  29. 29. @TEMPLATE Asocia 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() { } } @TEMPLATE Asocia 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) { } @TEMPLATE Asocia 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) { } @TEMPLATE Asocia 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) { } } @TEMPLATE Asocia un método acción con una plantilla
  34. 34. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html DOCTRINE http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/annotations.html #deSymfony @aferrandini http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/annotations-reference.html Doctrine Common Doctrine ORM Doctrine 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 ~VALIDATOR use SymfonyComponentValidatorConstraints as Assert; # app/config/config.yml framework: validation: { enable_annotations: true } Habilitar la validación con anotaciones
  38. 38. SYMFONY2 ~VALIDATOR @AssertNotBlank @AssertBlank @AssertNotNull @AssertNull @AssertTrue @AssertFalse @AssertType use SymfonyComponentValidatorConstraints as Assert; Restricciones básicas http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  39. 39. SYMFONY2 ~VALIDATOR @AssertEmail @AssertLength @AssertUrl @AssertRegex @AssertIp use SymfonyComponentValidatorConstraints as Assert; Restricciones cadenas de texto http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  40. 40. SYMFONY2 ~VALIDATOR @AssertRange @AssertDate @AssertDateTime @AssertTime use SymfonyComponentValidatorConstraints as Assert; Restricciones numéricas Restricciones con fechas http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  41. 41. SYMFONY2 ~VALIDATOR @AssertEqualTo @AssertNotEqualTo @AssertIdenticalTo @AssertNotIdenticalTo @AssertLessThan @AssertLessThanOrEqual @AssertGreaterThan @AssertGreaterThanOrEqual use SymfonyComponentValidatorConstraints as Assert; Restricciones comparativas http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  42. 42. SYMFONY2 ~VALIDATOR @AssertChoice @AssertCollection @AssertCount @AssertUniqueEntity @AssertLanguage @AssertLocale @AssertCountry use SymfonyComponentValidatorConstraints as Assert; Restricciones de colecciones http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  43. 43. SYMFONY2 ~VALIDATOR @AssertFile @AssertImage use SymfonyComponentValidatorConstraints as Assert; Restricciones de archivos http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  44. 44. SYMFONY2 ~VALIDATOR @AssertCardScheme @AssertLuhn @AssertIban @AssertIsbn @AssertIssn use SymfonyComponentValidatorConstraints as Assert; Restricciones bancarias y otras numéricas http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  45. 45. SYMFONY2 ~VALIDATOR @AssertCallback @AssertAll @AssertUserPassword @AssertValid use SymfonyComponentValidatorConstraints as Assert; Otras restricciones @CustomAssert http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  46. 46. Agregar las anotaciones con use use JMSSecurityExtraBundleAnnotationSecure; use JMSSecurityExtraBundleAnnotationSecureParam; use JMSSecurityExtraBundleAnnotationSecureReturn; use JMSSecurityExtraBundleAnnotationRunAs; use JMSSecurityExtraBundleAnnotationSatisfiesParentSecurityPolicy; JMSSECURITYEXTRABUNDLE Johannes Schmitt
  47. 47. @Secure @SecureParam JMSSECURITYEXTRABUNDLE @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 @SecureParam JMSSECURITYEXTRABUNDLE @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 @SecureParam JMSSECURITYEXTRABUNDLE @SecureReturn @RunAs @SatisfiesParentSecurityPolicy #deSymfony @aferrandini
  52. 52. @SECURERETURN // DeSymfony/Bundle/WebBundle/Services/AgendaService.php class AgendaService { /** * @SecureReturn(permissions=”VIEW”) */ public function agendaMethod() { return $objeto; } } Define restricciones para el valor devuelto
  53. 53. @Secure @SecureParam JMSSECURITYEXTRABUNDLE @SecureReturn @RunAs @SatisfiesParentSecurityPolicy #deSymfony @aferrandini
  54. 54. @RUNAS Cambia el ROL de ejecución de un método class 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 @CustomAnnotation DisableBundle https://github.com/aferrandini/DisableBundle Permite deshabilitar un Controlador o una Acción por tiempo y redireccionar a otra ruta. @ #deSymfony @aferrandini
  56. 56. #deSymfony @aferrandini Mother of God de las Anotaciones
  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. Buen provecho!
  60. 60. https://connect.sensiolabs.com/profile/aferrandini MUCHAS GRACIAS #deSymfony @aferrandini https://joind.in/8849 http://es.linkedin.com/in/arielferrandini https://github.com/aferrandini http://twitter.com/aferrandini

×