Slide 1

Slide 1 text

Symfony2 segundos pasos

Slide 2

Slide 2 text

Controladores frontales

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Controladores ● Reciben todas las peticiones. ● “Arrancan” Symfony2. ● Puede haber varios que carguen distintas configuraciones. ● Por defecto hay 2: ● Para producción. ● Para desarrollo.

Slide 5

Slide 5 text

Web Debug Bar ● Version de Symfony ● Detalles de PHP ● Profiling token ● Acción ejecutada ● Tiempo de carga ● Memoria consumida ● Detalles sobre seguridad ● Consultas ejecutadas

Slide 6

Slide 6 text

Web Debug Bar – Configuration

Slide 7

Slide 7 text

Web Debug Bar – Configuration

Slide 8

Slide 8 text

Web Debug Bar – Request

Slide 9

Slide 9 text

Web Debug Bar – Events

Slide 10

Slide 10 text

Web Debug Bar – Logs

Slide 11

Slide 11 text

Web Debug Bar – Doctrine

Slide 12

Slide 12 text

Consola de Symfony2

Slide 13

Slide 13 text

Consola de Symfony2 ● php app/console * ● Listar comandos: php app/console list ● Tareas comunes desde consola. ● Generadores automáticos del código. ● Gestión de la base de datos. ● Ayuda en la depuración.

Slide 14

Slide 14 text

Greatest hits ● php app/console cache:clear ● php app/console assets:install ● php app/console router:debug ● php app/console generate:* (lo veremos luego) ● php app/console doctrine:* (lo veremos luego)

Slide 15

Slide 15 text

Hablemos de la M de MVC

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Doctrine 2 ● Se divide en 3 componentes independientes: ● Doctrine Common ● Doctrine DBAL (incluye Common) ● Doctrine ORM (incluye DBAL + Common) ● No tiene nada que ver con “Doctrine 1” ● Reescrito totalmente. ● No es ActiveRecord. ● Pierde los Behaviors

Slide 18

Slide 18 text

Doctrine 2

Slide 19

Slide 19 text

Doctrine2: conceptos básicos ● Entity ● Objeto PHP ligero “normal” que equivale a una entidad. ● Los atributos del objeto son los campos en la BD. ● Los atributos deben estar encapsulados. ● Puede contener otros métodos. ● EntityManager ● “Punto de acceso” único del ORM. ● Gestión de la persistencia de objetos. ● Ejecución de consultas para obtener objetos. ● Patrón de diseño “Unit of Work”.

Slide 20

Slide 20 text

Doctrine1 vs. Doctrine2

Slide 21

Slide 21 text

Doctrine2 & Symfony2 ● Doctrine2 viene por defecto incluido en Symfony2 (de momento). ● Es un bundle más. ● Doctrine2Bundle añade: ● Definir Entities usando anotaciones. ● Utilidades por línea de comandos.

Slide 22

Slide 22 text

Aprendiendo con ejemplos

Slide 23

Slide 23 text

Vamos a partir del proyecto bajado antes

Slide 24

Slide 24 text

Proyecto con todo hecho https://github.com/csuarez/theevnt-symfony2

Slide 25

Slide 25 text

Generando un bundle nuevo php app/console generate:bundle

Slide 26

Slide 26 text

php app/console generate:bundle ● Bundle namespace ● TheEvnt/LibraryBundle ● Bundle name ● TheEvntLibraryBundle (default) ● Target directory: ● /var/www/Symfony/src ● Configuration format ● Annotation ● Do you want to generate the whole directory structure ● No ● Do you confirm generation ● Yes ● Confirm automatic update of your Kernel ● Yes ● Confirm automatic update of the Routing ● Yes

Slide 27

Slide 27 text

Estructura Bundle

Slide 28

Slide 28 text

Añadimos una carpeta para nuestras Entities

Slide 29

Slide 29 text

Nuestra primera entidad

Slide 30

Slide 30 text

¡¡Faltan setters y getters!!

Slide 31

Slide 31 text

php app/console doctrine:generate:entities TheEvnt/LibraryBundle/Entity/Book ¡¡Consola al rescate!!

Slide 32

Slide 32 text

También habría valido php app/console doctrine:generate:entities TheEvntLibraryBundle php app/console doctrine:generate:entities TheEvnt

Slide 33

Slide 33 text

Nuestra entidad a la BD php app/console doctrine:schema:update --force

Slide 34

Slide 34 text

Nuestra entidad a BD

Slide 35

Slide 35 text

Creando una acción que añada entidades

Slide 36

Slide 36 text

http://localhost/Symfony/web/app_dev.php/createBook

Slide 37

Slide 37 text

Creando una acción que borre entidades

Slide 38

Slide 38 text

http://localhost/Symfony/web/app_dev.php/deleteBook/5

Slide 39

Slide 39 text

Creando una acción que edite entidades

Slide 40

Slide 40 text

http://localhost/Symfony/web/app_dev.php/incrementYear/5

Slide 41

Slide 41 text

Añadiendo métodos a nuestra entidad

Slide 42

Slide 42 text

Añadiendo métodos a nuestra entidad

Slide 43

Slide 43 text

Añadiendo métodos a nuestra entidad

Slide 44

Slide 44 text

Consultando en la base de datos

Slide 45

Slide 45 text

Funciones de las clases repositorio

Slide 46

Slide 46 text

Más funciones de las clases repositorio

Slide 47

Slide 47 text

Consultas complejas

Slide 48

Slide 48 text

Dos opciones DQL Doctrine Query Builder

Slide 49

Slide 49 text

DQL ● Lenguaje de consulta creado para Doctrine ● Casi igual que SQL ● Las entidades son clases ● Los campos son atributos ● Devuelven Entities

Slide 50

Slide 50 text

Doctrine Query Builder ● Manera alternativa para crear consultas. ● Menos flexible que DQL. ● Más legible que DQL. ● Se usa un objeto QueryBuilder asociado a una Entity. ● Implementa una interfaz fluida.

Slide 51

Slide 51 text

Si tengo una consulta que uso mucho... ¿Dónde la coloco?

Slide 52

Slide 52 text

¿En una Entity?

Slide 53

Slide 53 text

¿En una Entity? ¡NO!

Slide 54

Slide 54 text

¿En una clase cualquiera?

Slide 55

Slide 55 text

¿En una clase cualquiera? Meh.

Slide 56

Slide 56 text

Podemos crear repositorios propios

Slide 57

Slide 57 text

En nuestra Entity...

Slide 58

Slide 58 text

php app/console doctrine:generate:entities TheEvnt Y generamos la clase automáticamente src/TheEvnt/LibraryBundle/Repository Y luego...

Slide 59

Slide 59 text

Podemos añadir métodos...

Slide 60

Slide 60 text

...y usarlos en nuestras acciones

Slide 61

Slide 61 text

Relaciones entre entidades

Slide 62

Slide 62 text

A partir de aquí voy a meter el turbo :(

Slide 63

Slide 63 text

Tantos las relaciones 1:N y las N:M se definen en la Entity

Slide 64

Slide 64 text

Modelo E/R

Slide 65

Slide 65 text

src/TheEvnt/LibraryBundle/Entity/Author.php

Slide 66

Slide 66 text

src/TheEvnt/LibraryBundle/Entity/Category.php

Slide 67

Slide 67 text

Relaciones 1:N Book Author

Slide 68

Slide 68 text

php app/console doctrine:generate:entities TheEvnt

Slide 69

Slide 69 text

Relaciones 1:N Book

Slide 70

Slide 70 text

Relaciones 1:N Author

Slide 71

Slide 71 text

Relaciones N:M Book Category

Slide 72

Slide 72 text

php app/console doctrine:generate:entities TheEvnt

Slide 73

Slide 73 text

Relaciones N:M Book

Slide 74

Slide 74 text

Relaciones N:M Category

Slide 75

Slide 75 text

Doctrine2 LifeCycle Callbacks

Slide 76

Slide 76 text

Ayudan a ejecutar acciones antes o después de algunos eventos

Slide 77

Slide 77 text

Se definen con anotaciones

Slide 78

Slide 78 text

LifeCycle Callbacks disponibles ● preRemove ● postRemove ● prePersist ● postPersist ● preUpdate ● postUpdate ● postLoad ● loadClassMetadata

Slide 79

Slide 79 text

Scaffolding

Slide 80

Slide 80 text

Proceso automático de generación de backend para entidades Controladores Acciones Vistas Rutas

Slide 81

Slide 81 text

Para cada entidad se generan un CRUD Create Read Update Delete

Slide 82

Slide 82 text

php app/console generate:doctrine:crud

Slide 83

Slide 83 text

Formularios

Slide 84

Slide 84 text

Formularios + Symfony2 ● Symfony2 tiene un componente para formularios. ● Se crean mediante clases. ● Totalmente distinto a Symfony 1.X. ● Se integran con las Entities de Doctrine2. ● Las clases de formularios van en la carpeta Forms de un bundle. ● Helpers Twig para renderizar formularios.

Slide 85

Slide 85 text

Formularios + Symfony2

Slide 86

Slide 86 text

Validadores

Slide 87

Slide 87 text

Validadores de datos ● Se pueden definir en las Entities de Doctrine2 mediante anotaciones. ● Se integran con los formularios. ● Ejecutan los validadores. ● Muestran los mensajes de error.

Slide 88

Slide 88 text

Carga automática de clases

Slide 89

Slide 89 text

Añadiendo librerías de terceros

Slide 90

Slide 90 text

En app/autoload.php Namespaces Con prefijos PEAR

Slide 91

Slide 91 text

Añadiendo bundles de terceros

Slide 92

Slide 92 text

Aparte de registrar los namespaces en autoload.php...

Slide 93

Slide 93 text

En app/AppKernel.php

Slide 94

Slide 94 text

¿Ejemplos de bundles interesantes?

Slide 95

Slide 95 text

Bundles de terceros interesantes ● SonataAdminBundle // WhiteOctoberAdminBundle ● FOSRestBundle ● FOSFacebookBundle ● PagerFanta ● PropelBundle ● DoctrineMongoDBBundle ● StofDoctrineExtensionsBundle

Slide 96

Slide 96 text

http://bundles.knplabs.org/ & http://github.com

Slide 97

Slide 97 text

Y muchas más cosas se quedan en el tintero :(

Slide 98

Slide 98 text

Sistema de caché

Slide 99

Slide 99 text

Tests unitarios y funcionales ● Tests unitarios: PHPUnit (Bye Lime!) ● Tests funcionales: ● Cliente que simula peticiones. ● HTML Crawler.

Slide 100

Slide 100 text

Seguridad Internacionalización Service Container Assetic SwiftMailer Monolog

Slide 101

Slide 101 text

Y esto es todo :)

Slide 102

Slide 102 text

¡Gracias por vuestra atención! Es la hora de las preguntas

Slide 103

Slide 103 text

e-mail [email protected] twitter @tharandur