Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

62

description

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

Transcript of Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

Page 1: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini
Page 2: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini
Page 3: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

#deSymfony @aferrandini

Page 4: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

NO HABLARÉ DE COMIDA#deSymfony @aferrandini

Page 5: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

#deSymfony @aferrandini

¿QUIÉN SOY?

•Ariel Ferrandini Price (11-11-85)

•Programador PHP

•Symfony lover (0.9.8beta)

•DeSymfony early adopter

•¡Me encanta viajar!

Page 6: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

Page 7: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

#deSymfony @aferrandini

¿Qué diceeste loco?

Page 8: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

Request

¿Cómo funcionan las anotaciones?

#deSymfony @aferrandini

FrontControllerSymfony Kernel

Eventos

Page 9: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

¿Cómo funcionan las anotaciones?

#deSymfony @aferrandini

ReaderDriver Semántica

@AnnotationControllerFoo()@AnnotationActionFoo()

<?php

namespace Namespace\Foo;

use AnnotationFoo;

/** * @AnnotationControllerFoo() */class Controller{ /** * @AnnotationActionFoo() */ public function fooAction() { // ... }}

Page 10: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

¿Cómo funcionan las anotaciones?

Response

#deSymfony @aferrandini

Page 11: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

ANOTACIONESEN

#deSymfony @aferrandini

Page 12: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

FRAMEWORK EXTRA BUNDLE

# app/config/config.ymlsensio_framework_extra: router: { annotations: true } request: { converters: true } view: { annotations: true } cache: { annotations: true }

Habilitar las anotaciones

Page 13: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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;

Page 14: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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: annotation

Activar rutas con anotaciones

Page 15: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

ENRUTAMIENTO

@Route @Method

#deSymfony @aferrandini

Page 16: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@ROUTE

// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php

/** * @Route(“/agenda”) */class AgendaController extends Controller{ /** * @Route(“/”, name=”agenda”) */ public function agendaAction() { }}

Configurar rutas con anotaciones

Page 17: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@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) { }}

Page 18: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@ROUTE

Configurar rutas con anotaciones// 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) { }}

Page 19: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

ROUTING

@Route @Method

#deSymfony @aferrandini

Page 20: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@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

Page 21: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

CONVERSORES

@ParamConverter

#deSymfony @aferrandini

Page 22: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@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

Page 23: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

// 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

Page 24: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

// 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

Page 25: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

// 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

Page 26: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

// 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

Page 27: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

CACHE

@Cache

#deSymfony @aferrandini

Page 28: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@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

Page 29: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@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

Page 30: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

VISTA

@Template

#deSymfony @aferrandini

Page 31: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@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() { }}

Page 32: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

// 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

Page 33: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

// 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

Page 34: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

// 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

Page 35: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

// 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

Page 37: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

@HasLifecycleCallbacks

@ManyToOne @ManyToMany @OneToOne @OneToMany

@PostLoad @PostPersist @PostRemove@PostUpdate

@PrePersist @PreRemove@PreUpdate

#deSymfony @aferrandini

Page 38: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

DOCTRINE ORM

@ColumnResult

@ChangeTrackingPolicy

@DiscriminatorColumn

@DiscriminatorMap

@EntityResult

@FieldResult

@GeneratedValue @InheritanceType

@JoinColumns@JoinColumn@JoinTable

@MappedSuperclass

@NamedNativeQuery

@SequenceGenerator

@SqlResultSetMapping

@UniqueConstraint

@Version

#deSymfony @aferrandini

Page 39: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

SYMFONY2 ~ VALIDATORuse Symfony\Component\Validator\Constraints as Assert;

# app/config/config.ymlframework: validation: { enable_annotations: true }

Habilitar la validación con anotaciones

Page 40: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

Page 41: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

Page 42: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

Page 43: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

Page 44: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

Page 45: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

Page 46: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

Page 47: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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

Page 48: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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;

JMSSECURITYEXTRABUNDLEJohannes Schmitt

Page 49: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@Secure @SecureParam

JMSSECURITYEXTRABUNDLE

@SecureReturn @RunAs

@SatisfiesParentSecurityPolicy#deSymfony @aferrandini

Page 50: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@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

Page 51: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@Secure @SecureParam

JMSSECURITYEXTRABUNDLE

@SecureReturn @RunAs

@SatisfiesParentSecurityPolicy#deSymfony @aferrandini

Page 52: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@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

Page 53: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@Secure @SecureParam

JMSSECURITYEXTRABUNDLE

@SecureReturn @RunAs

@SatisfiesParentSecurityPolicy#deSymfony @aferrandini

Page 54: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@SECURERETURN

// DeSymfony/Bundle/WebBundle/Services/AgendaService.phpclass AgendaService{ /** * @SecureReturn(permissions=”VIEW”) */ public function agendaMethod() { return $objeto; }}

Define restricciones para el valor devuelto

Page 55: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@Secure @SecureParam

JMSSECURITYEXTRABUNDLE

@SecureReturn @RunAs

@SatisfiesParentSecurityPolicy#deSymfony @aferrandini

Page 56: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@RUNAS

Cambia 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() { // ... }}

Page 57: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

Ejemplo de @CustomAnnotation

DisableBundle

https://github.com/aferrandini/DisableBundlePermite deshabilitar un Controlador o una Acción por tiempo y redireccionar a otra ruta.

@

#deSymfony @aferrandini

Page 58: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

#deSymfony @aferrandini

Mother of Godde las

Anotaciones

Page 59: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

@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() { }

Page 60: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

¿PREGUNTAS?

#deSymfony @aferrandini

Page 61: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

Buen provecho!

Page 62: Anotaciones en Symfony. DeSymfony 2013. Ariel Ferrandini

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