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

62

description

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.

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

Page 1: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación
Page 2: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación
Page 3: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

#deSymfony @aferrandini

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

NO HABLARÉ DE COMIDA#deSymfony @aferrandini

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

#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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

#deSymfony @aferrandini

¿Qué diceeste loco?

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

Request

¿Cómo funcionan las anotaciones?

#deSymfony @aferrandini

FrontControllerSymfony Kernel

Eventos

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

¿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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

¿Cómo funcionan las anotaciones?

Response

#deSymfony @aferrandini

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

ANOTACIONESEN

#deSymfony @aferrandini

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

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

ENRUTAMIENTO

@Route @Method

#deSymfony @aferrandini

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

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

ROUTING

@Route @Method

#deSymfony @aferrandini

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

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

CONVERSORES

@ParamConverter

#deSymfony @aferrandini

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

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

// 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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

// 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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

// 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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

// 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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

CACHE

@Cache

#deSymfony @aferrandini

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

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

VISTA

@Template

#deSymfony @aferrandini

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

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

// 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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

// 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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

// 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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

// 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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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

@HasLifecycleCallbacks

@ManyToOne @ManyToMany @OneToOne @OneToMany

@PostLoad @PostPersist @PostRemove@PostUpdate

@PrePersist @PreRemove@PreUpdate

#deSymfony @aferrandini

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

DOCTRINE ORM

@ColumnResult

@ChangeTrackingPolicy

@DiscriminatorColumn

@DiscriminatorMap

@EntityResult

@FieldResult

@GeneratedValue @InheritanceType

@JoinColumns@JoinColumn@JoinTable

@MappedSuperclass

@NamedNativeQuery

@SequenceGenerator

@SqlResultSetMapping

@UniqueConstraint

@Version

#deSymfony @aferrandini

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

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

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

Habilitar la validación con anotaciones

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

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

@Secure @SecureParam

JMSSECURITYEXTRABUNDLE

@SecureReturn @RunAs

@SatisfiesParentSecurityPolicy#deSymfony @aferrandini

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

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

@Secure @SecureParam

JMSSECURITYEXTRABUNDLE

@SecureReturn @RunAs

@SatisfiesParentSecurityPolicy#deSymfony @aferrandini

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

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

@Secure @SecureParam

JMSSECURITYEXTRABUNDLE

@SecureReturn @RunAs

@SatisfiesParentSecurityPolicy#deSymfony @aferrandini

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

@SECURERETURN

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

Define restricciones para el valor devuelto

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

@Secure @SecureParam

JMSSECURITYEXTRABUNDLE

@SecureReturn @RunAs

@SatisfiesParentSecurityPolicy#deSymfony @aferrandini

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

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

#deSymfony @aferrandini

Mother of Godde las

Anotaciones

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

@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: deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación

¿PREGUNTAS?

#deSymfony @aferrandini

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

Buen provecho!

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

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