deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

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

  • 2,438 views
Uploaded 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,......

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.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • El video de la charla en:

    http://www.youtube.com/watch?feature=player_embedded&v=r4iMO3KiTxg
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
2,438
On Slideshare
1,361
From Embeds
1,077
Number of Embeds
12

Actions

Shares
Downloads
41
Comments
1
Likes
3

Embeds 1,077

http://librosweb.es 676
http://yosymfony.com 336
https://twitter.com 25
http://feeds.feedburner.com 12
http://devi-vm.local 7
http://cloud.feedly.com 7
http://feedly.com 6
http://lw.192.168.2.13.xip.io 3
http://librosweb.dev 2
http://plus.url.google.com 1
http://www.librosweb.es 1
http://digg.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. #deSymfony @aferrandini
  • 2. NO HABLARÉ DE COMIDA#deSymfony @aferrandini
  • 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. 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. #deSymfony @aferrandini¿Qué diceeste loco?
  • 6. Request¿Cómo funcionan las anotaciones?#deSymfony @aferrandiniFrontControllerSymfony KernelEventos
  • 7. ¿Cómo funcionan las anotaciones?#deSymfony @aferrandiniReaderDriver Semántica@AnnotationControllerFoo()@AnnotationActionFoo()<?phpnamespace NamespaceFoo;use AnnotationFoo;/*** @AnnotationControllerFoo()*/class Controller{/*** @AnnotationActionFoo()*/public function fooAction(){// ...}}
  • 8. ¿Cómo funcionan las anotaciones?Response#deSymfony @aferrandini
  • 9. ANOTACIONESEN#deSymfony @aferrandini
  • 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. FRAMEWORK EXTRA BUNDLEAgregar las anotaciones con useuse SensioBundleFrameworkExtraBundleConfigurationRoute;use SensioBundleFrameworkExtraBundleConfigurationMethod;use SensioBundleFrameworkExtraBundleConfigurationParamConverter;use SensioBundleFrameworkExtraBundleConfigurationCache;use SensioBundleFrameworkExtraBundleConfigurationTemplate;
  • 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. ENRUTAMIENTO@Route @Method#deSymfony @aferrandini
  • 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. @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. @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. ROUTING@Route @Method#deSymfony @aferrandini
  • 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. CONVERSORES@ParamConverter#deSymfony @aferrandini
  • 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. // 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. // 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. // 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. // 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. CACHE@Cache#deSymfony @aferrandini
  • 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. @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. VISTA@Template#deSymfony @aferrandini
  • 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. // 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. // 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. // 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. // 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. 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. DOCTRINE ORM@Column@Entity @Index @Id @OrderBy@Table@HasLifecycleCallbacks@ManyToOne @ManyToMany @OneToOne @OneToMany@PostLoad @PostPersist @PostRemove@PostUpdate@PrePersist @PreRemove@PreUpdate#deSymfony @aferrandini
  • 36. DOCTRINE ORM@ColumnResult@ChangeTrackingPolicy@DiscriminatorColumn@DiscriminatorMap@EntityResult@FieldResult@GeneratedValue @InheritanceType@JoinColumns@JoinColumn@JoinTable@MappedSuperclass@NamedNativeQuery@SequenceGenerator@SqlResultSetMapping@UniqueConstraint@Version#deSymfony @aferrandini
  • 37. SYMFONY2 ~VALIDATORuse SymfonyComponentValidatorConstraints as Assert;# app/config/config.ymlframework:validation: { enable_annotations: true }Habilitar la validación con anotaciones
  • 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. SYMFONY2 ~VALIDATOR@AssertEmail@AssertLength@AssertUrl@AssertRegex@AssertIpuse SymfonyComponentValidatorConstraints as Assert;Restricciones cadenas de textohttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  • 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. 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. 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. SYMFONY2 ~VALIDATOR@AssertFile @AssertImageuse SymfonyComponentValidatorConstraints as Assert;Restricciones de archivoshttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  • 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. SYMFONY2 ~VALIDATOR@AssertCallback@AssertAll@AssertUserPassword@AssertValiduse SymfonyComponentValidatorConstraints as Assert;Otras restricciones@CustomAsserthttp://symfony.com/doc/current/book/validation.html#deSymfony @aferrandini
  • 46. Agregar las anotaciones con useuse JMSSecurityExtraBundleAnnotationSecure;use JMSSecurityExtraBundleAnnotationSecureParam;use JMSSecurityExtraBundleAnnotationSecureReturn;use JMSSecurityExtraBundleAnnotationRunAs;use JMSSecurityExtraBundleAnnotationSatisfiesParentSecurityPolicy;JMSSECURITYEXTRABUNDLEJohannes Schmitt
  • 47. @Secure @SecureParamJMSSECURITYEXTRABUNDLE@SecureReturn @RunAs@SatisfiesParentSecurityPolicy#deSymfony @aferrandini
  • 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. @Secure @SecureParamJMSSECURITYEXTRABUNDLE@SecureReturn @RunAs@SatisfiesParentSecurityPolicy#deSymfony @aferrandini
  • 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. @Secure @SecureParamJMSSECURITYEXTRABUNDLE@SecureReturn @RunAs@SatisfiesParentSecurityPolicy#deSymfony @aferrandini
  • 52. @SECURERETURN// DeSymfony/Bundle/WebBundle/Services/AgendaService.phpclass AgendaService{/*** @SecureReturn(permissions=”VIEW”)*/public function agendaMethod(){return $objeto;}}Define restricciones para el valor devuelto
  • 53. @Secure @SecureParamJMSSECURITYEXTRABUNDLE@SecureReturn @RunAs@SatisfiesParentSecurityPolicy#deSymfony @aferrandini
  • 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. Ejemplo de @CustomAnnotationDisableBundlehttps://github.com/aferrandini/DisableBundlePermite deshabilitar un Controlador o una Acción por tiempo y redireccionar aotra ruta.@#deSymfony @aferrandini
  • 56. #deSymfony @aferrandiniMother of Godde lasAnotaciones
  • 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. ¿PREGUNTAS?#deSymfony @aferrandini
  • 59. Buenprovecho!
  • 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