SlideShare una empresa de Scribd logo
1 de 62
Descargar para leer sin conexión
#deSymfony @aferrandini
NO HABLARÉ DE COMIDA
#deSymfony @aferrandini
#deSymfony @aferrandini
¿QUIÉN SOY?
•Ariel Ferrandini Price (11-11-85)
•Programador PHP
•Symfony lover (0.9.8beta)
•DeSymfony early adopter
•¡Me encanta viajar!
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
#deSymfony @aferrandini
¿Qué dice
este loco?
Request
¿Cómo funcionan las anotaciones?
#deSymfony @aferrandini
FrontController
Symfony Kernel
Eventos
¿Cómo funcionan las anotaciones?
#deSymfony @aferrandini
ReaderDriver Semántica
@AnnotationControllerFoo()
@AnnotationActionFoo()
<?php
namespace NamespaceFoo;
use AnnotationFoo;
/**
* @AnnotationControllerFoo()
*/
class Controller
{
/**
* @AnnotationActionFoo()
*/
public function fooAction()
{
// ...
}
}
¿Cómo funcionan las anotaciones?
Response
#deSymfony @aferrandini
ANOTACIONES
EN
#deSymfony @aferrandini
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
FRAMEWORK EXTRA BUNDLE
Agregar las anotaciones con use
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SensioBundleFrameworkExtraBundleConfigurationMethod;
use SensioBundleFrameworkExtraBundleConfigurationParamConverter;
use SensioBundleFrameworkExtraBundleConfigurationCache;
use SensioBundleFrameworkExtraBundleConfigurationTemplate;
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
ENRUTAMIENTO
@Route @Method
#deSymfony @aferrandini
@ROUTE
// DeSymfony/Bundle/WebBundle/Controller/AgendaController.php
/**
* @Route(“/agenda”)
*/
class AgendaController extends Controller
{
/**
* @Route(“/”, name=”agenda”)
*/
public function agendaAction()
{
}
}
Configurar rutas con anotaciones
@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)
{
}
}
@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)
{
}
}
ROUTING
@Route @Method
#deSymfony @aferrandini
@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
CONVERSORES
@ParamConverter
#deSymfony @aferrandini
@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
// 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
// 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
// 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
// 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
CACHE
@Cache
#deSymfony @aferrandini
@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
@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
VISTA
@Template
#deSymfony @aferrandini
@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()
{
}
}
// 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
// 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
// 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
// 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
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
DOCTRINE ORM
@Column@Entity @Index @Id @OrderBy@Table
@HasLifecycleCallbacks
@ManyToOne @ManyToMany @OneToOne @OneToMany
@PostLoad @PostPersist @PostRemove@PostUpdate
@PrePersist @PreRemove@PreUpdate
#deSymfony @aferrandini
DOCTRINE ORM
@ColumnResult
@ChangeTrackingPolicy
@DiscriminatorColumn
@DiscriminatorMap
@EntityResult
@FieldResult
@GeneratedValue @InheritanceType
@JoinColumns@JoinColumn@JoinTable
@MappedSuperclass
@NamedNativeQuery
@SequenceGenerator
@SqlResultSetMapping
@UniqueConstraint
@Version
#deSymfony @aferrandini
SYMFONY2 ~VALIDATOR
use SymfonyComponentValidatorConstraints as Assert;
# app/config/config.yml
framework:
validation: { enable_annotations: true }
Habilitar la validación con anotaciones
SYMFONY2 ~VALIDATOR
@AssertNotBlank
@AssertBlank
@AssertNotNull
@AssertNull
@AssertTrue
@AssertFalse
@AssertType
use SymfonyComponentValidatorConstraints as Assert;
Restricciones básicas
http://symfony.com/doc/current/book/validation.html
#deSymfony @aferrandini
SYMFONY2 ~VALIDATOR
@AssertEmail
@AssertLength
@AssertUrl
@AssertRegex
@AssertIp
use SymfonyComponentValidatorConstraints as Assert;
Restricciones cadenas de texto
http://symfony.com/doc/current/book/validation.html
#deSymfony @aferrandini
SYMFONY2 ~VALIDATOR
@AssertRange @AssertDate
@AssertDateTime
@AssertTime
use SymfonyComponentValidatorConstraints as Assert;
Restricciones numéricas Restricciones con fechas
http://symfony.com/doc/current/book/validation.html
#deSymfony @aferrandini
SYMFONY2 ~VALIDATOR
@AssertEqualTo
@AssertNotEqualTo
@AssertIdenticalTo
@AssertNotIdenticalTo
@AssertLessThan
@AssertLessThanOrEqual
@AssertGreaterThan
@AssertGreaterThanOrEqual
use SymfonyComponentValidatorConstraints as Assert;
Restricciones comparativas
http://symfony.com/doc/current/book/validation.html
#deSymfony @aferrandini
SYMFONY2 ~VALIDATOR
@AssertChoice
@AssertCollection
@AssertCount
@AssertUniqueEntity
@AssertLanguage
@AssertLocale
@AssertCountry
use SymfonyComponentValidatorConstraints as Assert;
Restricciones de colecciones
http://symfony.com/doc/current/book/validation.html
#deSymfony @aferrandini
SYMFONY2 ~VALIDATOR
@AssertFile @AssertImage
use SymfonyComponentValidatorConstraints as Assert;
Restricciones de archivos
http://symfony.com/doc/current/book/validation.html
#deSymfony @aferrandini
SYMFONY2 ~VALIDATOR
@AssertCardScheme
@AssertLuhn
@AssertIban
@AssertIsbn
@AssertIssn
use SymfonyComponentValidatorConstraints as Assert;
Restricciones bancarias y otras numéricas
http://symfony.com/doc/current/book/validation.html
#deSymfony @aferrandini
SYMFONY2 ~VALIDATOR
@AssertCallback
@AssertAll
@AssertUserPassword
@AssertValid
use SymfonyComponentValidatorConstraints as Assert;
Otras restricciones
@CustomAssert
http://symfony.com/doc/current/book/validation.html
#deSymfony @aferrandini
Agregar las anotaciones con use
use JMSSecurityExtraBundleAnnotationSecure;
use JMSSecurityExtraBundleAnnotationSecureParam;
use JMSSecurityExtraBundleAnnotationSecureReturn;
use JMSSecurityExtraBundleAnnotationRunAs;
use JMSSecurityExtraBundleAnnotationSatisfiesParentSecurityPolicy;
JMSSECURITYEXTRABUNDLE
Johannes Schmitt
@Secure @SecureParam
JMSSECURITYEXTRABUNDLE
@SecureReturn @RunAs
@SatisfiesParentSecurityPolicy
#deSymfony @aferrandini
@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
@Secure @SecureParam
JMSSECURITYEXTRABUNDLE
@SecureReturn @RunAs
@SatisfiesParentSecurityPolicy
#deSymfony @aferrandini
@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
@Secure @SecureParam
JMSSECURITYEXTRABUNDLE
@SecureReturn @RunAs
@SatisfiesParentSecurityPolicy
#deSymfony @aferrandini
@SECURERETURN
// DeSymfony/Bundle/WebBundle/Services/AgendaService.php
class AgendaService
{
/**
* @SecureReturn(permissions=”VIEW”)
*/
public function agendaMethod()
{
return $objeto;
}
}
Define restricciones para el valor devuelto
@Secure @SecureParam
JMSSECURITYEXTRABUNDLE
@SecureReturn @RunAs
@SatisfiesParentSecurityPolicy
#deSymfony @aferrandini
@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()
{
// ...
}
}
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
#deSymfony @aferrandini
Mother of God
de las
Anotaciones
@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()
{
}
¿PREGUNTAS?
#deSymfony @aferrandini
Buen
provecho!
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

Más contenido relacionado

Destacado

Presentazione telesurvey italia
Presentazione telesurvey italiaPresentazione telesurvey italia
Presentazione telesurvey italiaTiziana Urru
 
Training Games - und schon macht es mehr Spass!
Training Games - und schon macht es mehr Spass!Training Games - und schon macht es mehr Spass!
Training Games - und schon macht es mehr Spass!Michael Wyrsch
 
Is Your Phone Turning You into an Adrenaline Junkie?
Is Your Phone Turning You into an Adrenaline Junkie?Is Your Phone Turning You into an Adrenaline Junkie?
Is Your Phone Turning You into an Adrenaline Junkie?Mark Ostach
 
Informe políticas fiscales
Informe políticas fiscalesInforme políticas fiscales
Informe políticas fiscalesAuditoriaVLC
 
Gp0012 sampledescription
Gp0012 sampledescriptionGp0012 sampledescription
Gp0012 sampledescriptionIvan Leyzan
 
BALPARMAK CORPORATE PRESENTATION
BALPARMAK CORPORATE PRESENTATIONBALPARMAK CORPORATE PRESENTATION
BALPARMAK CORPORATE PRESENTATIONDorukan Tarman
 
Bachelor Project Degree-Processing and mechanical analysis of electro-spun an...
Bachelor Project Degree-Processing and mechanical analysis of electro-spun an...Bachelor Project Degree-Processing and mechanical analysis of electro-spun an...
Bachelor Project Degree-Processing and mechanical analysis of electro-spun an...Alvaro Diaz Mendoza
 
Where20 2008 Ruby Tutorial
Where20 2008 Ruby TutorialWhere20 2008 Ruby Tutorial
Where20 2008 Ruby TutorialShoaib Burq
 
Geobox: la plataforma de informes de Geomarketing de Traycco
Geobox: la plataforma de informes de Geomarketing de TrayccoGeobox: la plataforma de informes de Geomarketing de Traycco
Geobox: la plataforma de informes de Geomarketing de TrayccoDavid Piles Fuertes
 
2016 08-30 Kubernetes talk for Waterloo DevOps
2016 08-30 Kubernetes talk for Waterloo DevOps2016 08-30 Kubernetes talk for Waterloo DevOps
2016 08-30 Kubernetes talk for Waterloo DevOpscraigbox
 

Destacado (15)

Presentazione telesurvey italia
Presentazione telesurvey italiaPresentazione telesurvey italia
Presentazione telesurvey italia
 
Training Games - und schon macht es mehr Spass!
Training Games - und schon macht es mehr Spass!Training Games - und schon macht es mehr Spass!
Training Games - und schon macht es mehr Spass!
 
Netschools (2)
Netschools (2)Netschools (2)
Netschools (2)
 
Is Your Phone Turning You into an Adrenaline Junkie?
Is Your Phone Turning You into an Adrenaline Junkie?Is Your Phone Turning You into an Adrenaline Junkie?
Is Your Phone Turning You into an Adrenaline Junkie?
 
Informe políticas fiscales
Informe políticas fiscalesInforme políticas fiscales
Informe políticas fiscales
 
Santa Bertilla
Santa BertillaSanta Bertilla
Santa Bertilla
 
Gp0012 sampledescription
Gp0012 sampledescriptionGp0012 sampledescription
Gp0012 sampledescription
 
BALPARMAK CORPORATE PRESENTATION
BALPARMAK CORPORATE PRESENTATIONBALPARMAK CORPORATE PRESENTATION
BALPARMAK CORPORATE PRESENTATION
 
Clase 2 Diseño de Hormigón Armado -
Clase 2 Diseño de Hormigón Armado -Clase 2 Diseño de Hormigón Armado -
Clase 2 Diseño de Hormigón Armado -
 
Bachelor Project Degree-Processing and mechanical analysis of electro-spun an...
Bachelor Project Degree-Processing and mechanical analysis of electro-spun an...Bachelor Project Degree-Processing and mechanical analysis of electro-spun an...
Bachelor Project Degree-Processing and mechanical analysis of electro-spun an...
 
2013 tms gvu lysimeter
2013 tms gvu lysimeter 2013 tms gvu lysimeter
2013 tms gvu lysimeter
 
Where20 2008 Ruby Tutorial
Where20 2008 Ruby TutorialWhere20 2008 Ruby Tutorial
Where20 2008 Ruby Tutorial
 
Geobox: la plataforma de informes de Geomarketing de Traycco
Geobox: la plataforma de informes de Geomarketing de TrayccoGeobox: la plataforma de informes de Geomarketing de Traycco
Geobox: la plataforma de informes de Geomarketing de Traycco
 
2016 08-30 Kubernetes talk for Waterloo DevOps
2016 08-30 Kubernetes talk for Waterloo DevOps2016 08-30 Kubernetes talk for Waterloo DevOps
2016 08-30 Kubernetes talk for Waterloo DevOps
 
Inclusion En Marcos Ramon
Inclusion En Marcos RamonInclusion En Marcos Ramon
Inclusion En Marcos Ramon
 

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

Symfony: Domesticando las Vistas
Symfony: Domesticando las VistasSymfony: Domesticando las Vistas
Symfony: Domesticando las VistasJose Antonio Pio
 
Symfony: Domesticando las Vistas - decharlas
Symfony: Domesticando las Vistas - decharlasSymfony: Domesticando las Vistas - decharlas
Symfony: Domesticando las Vistas - decharlasDecharlas
 
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...betabeers
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPJavier Eguiluz
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosJavier Eguiluz
 
Introducción a Laravel 5 - Un Framework para Artesanos Web
Introducción a Laravel 5 - Un Framework para Artesanos WebIntroducción a Laravel 5 - Un Framework para Artesanos Web
Introducción a Laravel 5 - Un Framework para Artesanos WebFacundo E. Goñi Perez
 
Introduccion A Php
Introduccion A PhpIntroduccion A Php
Introduccion A Phputs
 
Introduccion A Php
Introduccion A PhpIntroduccion A Php
Introduccion A Phputs
 
Introduccion A Php
Introduccion A PhpIntroduccion A Php
Introduccion A Phputs
 
Zen Scaffolding - Programador PHP
Zen Scaffolding - Programador PHPZen Scaffolding - Programador PHP
Zen Scaffolding - Programador PHPJuan Belón Pérez
 
Android UC3M Sesión 2
Android UC3M Sesión 2Android UC3M Sesión 2
Android UC3M Sesión 2topoos
 
Introducción al desarrollo Android, Sesión 2
Introducción al desarrollo Android, Sesión 2Introducción al desarrollo Android, Sesión 2
Introducción al desarrollo Android, Sesión 2findemor
 
Presentación de zan php
Presentación de zan phpPresentación de zan php
Presentación de zan phpCarlos Zantana
 

Similar a deSymfony 2013: Anotaciones, no es parte de mi aplicación, pero es mi aplicación (20)

Symfony: Domesticando las Vistas
Symfony: Domesticando las VistasSymfony: Domesticando las Vistas
Symfony: Domesticando las Vistas
 
Symfony: Domesticando las Vistas - decharlas
Symfony: Domesticando las Vistas - decharlasSymfony: Domesticando las Vistas - decharlas
Symfony: Domesticando las Vistas - decharlas
 
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
Introducción al microframework PHP Silex - Sergio Gómez - Betabeers Córdoba 0...
 
Silex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHPSilex, desarrollo web ágil y profesional con PHP
Silex, desarrollo web ágil y profesional con PHP
 
Composer: Gestionando dependencias en PHP
Composer: Gestionando dependencias en PHP Composer: Gestionando dependencias en PHP
Composer: Gestionando dependencias en PHP
 
Laravel 5.1
Laravel 5.1Laravel 5.1
Laravel 5.1
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
Introducción a Laravel 5 - Un Framework para Artesanos Web
Introducción a Laravel 5 - Un Framework para Artesanos WebIntroducción a Laravel 5 - Un Framework para Artesanos Web
Introducción a Laravel 5 - Un Framework para Artesanos Web
 
Plone en La Jornada
Plone en La JornadaPlone en La Jornada
Plone en La Jornada
 
Introduccion A Php
Introduccion A PhpIntroduccion A Php
Introduccion A Php
 
Introduccion A Php
Introduccion A PhpIntroduccion A Php
Introduccion A Php
 
Introduccion A Php
Introduccion A PhpIntroduccion A Php
Introduccion A Php
 
Zen Scaffolding - Programador PHP
Zen Scaffolding - Programador PHPZen Scaffolding - Programador PHP
Zen Scaffolding - Programador PHP
 
Android UC3M Sesión 2
Android UC3M Sesión 2Android UC3M Sesión 2
Android UC3M Sesión 2
 
Introducción al desarrollo Android, Sesión 2
Introducción al desarrollo Android, Sesión 2Introducción al desarrollo Android, Sesión 2
Introducción al desarrollo Android, Sesión 2
 
Introducción a Kohana Framework
Introducción a Kohana FrameworkIntroducción a Kohana Framework
Introducción a Kohana Framework
 
Symfony 2 CMF
Symfony 2 CMFSymfony 2 CMF
Symfony 2 CMF
 
33 php
33 php33 php
33 php
 
Presentación de zan php
Presentación de zan phpPresentación de zan php
Presentación de zan php
 
funciones con c++
funciones con c++funciones con c++
funciones con c++
 

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