Anotaciones en Symfony. DeSymfony 2013, Ariel Ferrandini

Anotaciones en Symfony. DeSymfony 2013, Ariel Ferrandini

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

C980aaaf45cdff7fc113e9c451dd4530?s=128

Paradigma

June 22, 2013
Tweet

Transcript

  1. None
  2. None
  3. #deSymfony @aferrandini

  4. NO HABLARÉ DE COMIDA #deSymfony @aferrandini

  5. #deSymfony @aferrandini ¿QUIÉN SOY? •Ariel Ferrandini Price (11-11-85) •Programador PHP

    •Symfony lover (0.9.8beta) •DeSymfony early adopter •¡Me encanta viajar!
  6. 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
  7. #deSymfony @aferrandini ¿Qué dice este loco?

  8. Request ¿Cómo funcionan las anotaciones? #deSymfony @aferrandini FrontController Symfony Kernel

    Eventos
  9. ¿Cómo funcionan las anotaciones? #deSymfony @aferrandini Reader Driver Semántica @AnnotationControllerFoo()

    @AnnotationActionFoo() <?php namespace Namespace\Foo; use AnnotationFoo; /** * @AnnotationControllerFoo() */ class Controller { /** * @AnnotationActionFoo() */ public function fooAction() { // ... } }
  10. ¿Cómo funcionan las anotaciones? Response #deSymfony @aferrandini

  11. ANOTACIONES EN #deSymfony @aferrandini

  12. 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
  13. FRAMEWORK EXTRA BUNDLE Agregar las anotaciones con use use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  14. 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
  15. ENRUTAMIENTO @Route @Method #deSymfony @aferrandini

  16. @ROUTE // DeSymfony/Bundle/WebBundle/Controller/AgendaController.php /** * @Route(“/agenda”) */ class AgendaController extends

    Controller { /** * @Route(“/”, name=”agenda”) */ public function agendaAction() { } } Configurar rutas con anotaciones
  17. @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) { } }
  18. @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) { } }
  19. ROUTING @Route @Method #deSymfony @aferrandini

  20. @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
  21. CONVERSORES @ParamConverter #deSymfony @aferrandini

  22. @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
  23. // 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
  24. // 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
  25. // 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
  26. // 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
  27. CACHE @Cache #deSymfony @aferrandini

  28. @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
  29. @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
  30. VISTA @Template #deSymfony @aferrandini

  31. @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() { } }
  32. // 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
  33. // 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
  34. // 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
  35. // 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
  36. 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
  37. DOCTRINE ORM @Column @Entity @Index @Id @OrderBy @Table @HasLifecycleCallbacks @ManyToOne

    @ManyToMany @OneToOne @OneToMany @PostLoad @PostPersist @PostRemove @PostUpdate @PrePersist @PreRemove @PreUpdate #deSymfony @aferrandini
  38. DOCTRINE ORM @ColumnResult @ChangeTrackingPolicy @DiscriminatorColumn @DiscriminatorMap @EntityResult @FieldResult @GeneratedValue @InheritanceType

    @JoinColumns @JoinColumn @JoinTable @MappedSuperclass @NamedNativeQuery @SequenceGenerator @SqlResultSetMapping @UniqueConstraint @Version #deSymfony @aferrandini
  39. SYMFONY2 ~ VALIDATOR use Symfony\Component\Validator\Constraints as Assert; # app/config/config.yml framework:

    validation: { enable_annotations: true } Habilitar la validación con anotaciones
  40. SYMFONY2 ~ VALIDATOR @Assert\NotBlank @Assert\Blank @Assert\NotNull @Assert\Null @Assert\True @Assert\False @Assert\Type

    use Symfony\Component\Validator\Constraints as Assert; Restricciones básicas http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  41. SYMFONY2 ~ VALIDATOR @Assert\Email @Assert\Length @Assert\Url @Assert\Regex @Assert\Ip use Symfony\Component\Validator\Constraints

    as Assert; Restricciones cadenas de texto http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  42. SYMFONY2 ~ VALIDATOR @Assert\Range @Assert\Date @Assert\DateTime @Assert\Time use Symfony\Component\Validator\Constraints as

    Assert; Restricciones numéricas Restricciones con fechas http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  43. SYMFONY2 ~ VALIDATOR @Assert\EqualTo @Assert\NotEqualTo @Assert\IdenticalTo @Assert\NotIdenticalTo @Assert\LessThan @Assert\LessThanOrEqual @Assert\GreaterThan

    @Assert\GreaterThanOrEqual use Symfony\Component\Validator\Constraints as Assert; Restricciones comparativas http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  44. SYMFONY2 ~ VALIDATOR @Assert\Choice @Assert\Collection @Assert\Count @Assert\UniqueEntity @Assert\Language @Assert\Locale @Assert\Country

    use Symfony\Component\Validator\Constraints as Assert; Restricciones de colecciones http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  45. SYMFONY2 ~ VALIDATOR @Assert\File @Assert\Image use Symfony\Component\Validator\Constraints as Assert; Restricciones

    de archivos http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  46. SYMFONY2 ~ VALIDATOR @Assert\CardScheme @Assert\Luhn @Assert\Iban @Assert\Isbn @Assert\Issn use Symfony\Component\Validator\Constraints

    as Assert; Restricciones bancarias y otras numéricas http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  47. SYMFONY2 ~ VALIDATOR @Assert\Callback @Assert\All @Assert\UserPassword @Assert\Valid use Symfony\Component\Validator\Constraints as

    Assert; Otras restricciones @CustomAssert http://symfony.com/doc/current/book/validation.html #deSymfony @aferrandini
  48. Agregar las anotaciones con use use JMS\SecurityExtraBundle\Annotation\Secure; use JMS\SecurityExtraBundle\Annotation\SecureParam; use

    JMS\SecurityExtraBundle\Annotation\SecureReturn; use JMS\SecurityExtraBundle\Annotation\RunAs; use JMS\SecurityExtraBundle\Annotation\SatisfiesParentSecurityPolicy; JMSSECURITYEXTRABUNDLE Johannes Schmitt
  49. @Secure @SecureParam JMSSECURITYEXTRABUNDLE @SecureReturn @RunAs @SatisfiesParentSecurityPolicy #deSymfony @aferrandini

  50. @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
  51. @Secure @SecureParam JMSSECURITYEXTRABUNDLE @SecureReturn @RunAs @SatisfiesParentSecurityPolicy #deSymfony @aferrandini

  52. @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
  53. @Secure @SecureParam JMSSECURITYEXTRABUNDLE @SecureReturn @RunAs @SatisfiesParentSecurityPolicy #deSymfony @aferrandini

  54. @SECURERETURN // DeSymfony/Bundle/WebBundle/Services/AgendaService.php class AgendaService { /** * @SecureReturn(permissions=”VIEW”) */

    public function agendaMethod() { return $objeto; } } Define restricciones para el valor devuelto
  55. @Secure @SecureParam JMSSECURITYEXTRABUNDLE @SecureReturn @RunAs @SatisfiesParentSecurityPolicy #deSymfony @aferrandini

  56. @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() { // ... } }
  57. 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
  58. #deSymfony @aferrandini Mother of God de las Anotaciones

  59. @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() { }
  60. ¿PREGUNTAS? #deSymfony @aferrandini

  61. Buen provecho!

  62. 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