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. 1.
  2. 2.
  3. 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!
  4. 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
  5. 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() { // ... } }
  6. 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
  7. 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;
  8. 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
  9. 16.

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

    Controller { /** * @Route(“/”, name=”agenda”) */ public function agendaAction() { } } Configurar rutas con anotaciones
  10. 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) { } }
  11. 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) { } }
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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() { } }
  20. 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
  21. 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
  22. 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
  23. 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
  24. 37.

    DOCTRINE ORM @Column @Entity @Index @Id @OrderBy @Table @HasLifecycleCallbacks @ManyToOne

    @ManyToMany @OneToOne @OneToMany @PostLoad @PostPersist @PostRemove @PostUpdate @PrePersist @PreRemove @PreUpdate #deSymfony @aferrandini
  25. 38.

    DOCTRINE ORM @ColumnResult @ChangeTrackingPolicy @DiscriminatorColumn @DiscriminatorMap @EntityResult @FieldResult @GeneratedValue @InheritanceType

    @JoinColumns @JoinColumn @JoinTable @MappedSuperclass @NamedNativeQuery @SequenceGenerator @SqlResultSetMapping @UniqueConstraint @Version #deSymfony @aferrandini
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 54.

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

    public function agendaMethod() { return $objeto; } } Define restricciones para el valor devuelto
  39. 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() { // ... } }
  40. 57.
  41. 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() { }