Symfony – Sobre mi... – Agenda



Symfony – Sobre mi... – Agenda

0 0


phpday-2015-symfony-presentation

PHPday Uruguay 2015 presentation

On Github vallejos / phpday-2015-symfony-presentation

Introduccion a

Symfony

Por Fabian Vallejos / @vallejosfab

Bienvenidos!

Hablemos de

Sobre mi...

Fabian Vallejos

Programador Web desde mas o menos comienzos de siglo :)

Front End / Back End / Mobile

Experiencia en PHP, MySQL, JavaScript

Angular JS, Symfony 2

Sysadmin / Devops

Perl, Bash Scripting, Java, C++

... y otros ya pasados de moda...

(Ej: Tcl/Tk, StarBasic, etc)

Contacto

Twitter: @vallejosfab

Blog: http://fabianvallejos.com

Agenda

1. Que es Symfony?

2. Instalacion / Configuracion

3. Routing

4. Controllers

5. Templates

Ejemplo Symfony 2.7

Recomendaciones, Tips, Mejores Practicas

Symfony es mucho mas...

Bundles, Forms

Databases, Doctrine, ORM

Seguridad, Traduccion, Internalizacion

Dependency Injection

Assetic, Cache, Testing, Deployment

Documentacion, Comunidad

... Mucho Mas!

No hay tiempo para todo

1. Que es Symfony?

Framework PHP

desarrollado por

(de los mas usados)

Top PHP projects en GitHub!

Gran comunidad!

1. Que es Symfony? (cont...)

Libreria de Componentes

Traduccion:

Se puede usar cualquier parte de Symfony en cualquier proyecto PHP

Algunos componentes:

Asset

Console

Finder

Routing

Ver mas: http://symfony.com/components

Asset: js, css, images Routing: mapeo de rutas a variables Finder: busca files y folders

Proyectos que usan componentes de Symfony:

Drupal

Laravel

Magento

phpBB

Joomla

Silex

Ver mas: http://symfony.com/projects

Como se logra esto?

1. Se usa composer

(Manejador de paquetes de PHP)

2. Se siguen estandares PSR

(code style, interfaces, class naming, etc)

Ver mas: http://www.php-fig.org/

Por que usar Symfony?

1. Gran comunidad (no estas solo)

(muchos problemas ya estan resueltos)

2. Seguir standards + Aprender buenas practicas

=

Probablemente seas un mejor programador ;)

y

Mejores aplicaciones, mas seguras, mejor testeadas, etc.

2. Instalacion / Configuracion

Requisitos

PHP >= 5.3.9

Habilitar JSON y ctype

Setear date.timezone en el php.ini

Opcionalmente

PHP-XML, libxml, mbstring, Intl, y otros mas...

Mas info: http://symfony.com/doc/current/reference/requirements.html

* Tip *

Seteos recomendados en php.ini

short_open_tag = Off
magic_quotes_gpc = Off
register_globals = Off
session.auto_start = Off

Para usar Doctrine ORM

Instalar PDO y el driver PDO que vayan a usar

(ej: pdo-mysql para usar MySQL)

* Tip* : No usar mysql_connect()

Tip

Se puede verificar si tu sistema "soporta" Symfony:

Cargar en el navegador web/config.php o ejecutando desde la terminal:

$ php app/check.php

Descarga

Ir a: http://symfony.com/download

Instalar Symfony

Linux / Mac OS

$ sudo curl -LsS http://symfony.com/installer \
  -o /usr/local/bin/symfony
$ sudo chmod a+x /usr/local/bin/symfony

Windows

c:\> php -r "readfile('http://symfony.com/installer');" > symfony

Crear un proyecto:

$ symfony new mi_proyecto

Usar una version especifica:

$ symfony new otro-proyecto 2.7

Usar un componente:

$ composer require symfony/Intl

Instalar Composer

Linux / Mac OS

$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
$ php installer
$ sudo mv composer.phar /usr/local/bin/composer

Windows: https://getcomposer.org/download

Veamos nuestro primer proyecto...

$ php app/console server:run

o lo que es lo mismo:

$ cd web
$ php -S localhost:8000

(requiere PHP >= 5.4)

Ir a: http://localhost:8000/app_dev.php

Ejemplo:

Nuestra primera pagina en PHP Symfony!

Basicamente necesitamos 2 cosas:

1. Crear una Ruta

2. Crear un Controlador

(ya vamos a hablar de esto en breve)

Archivos y carpetas de ejemplo

Archivos y carpetas de ejemplo

/app: configuracion, y otras cosas para que funcione la app (controla todo)

/bin: binarios de composer (ignorar por ahora)

/src: el codigo fuente de nuestra magia (bundles)

/vendor: librerias de terceros

/web: el document_root de nuestra aplicacion, css, pics, etc

Bundle?

Modulo

Feature

Plugin

Una "parte" de la app

Carpeta dentro de src/

Ej: src/Login

Archivos importantes en /app

/app/AppKernel.php

- activar nuestros bundles

/app/config/config.yml

- configurar la aplicacion, bundles y librerias

/app/config/routing.yml

- setear las rutas

(ignorar los demas archivos en app/config por ahora)

/app/Resources/views/

- console scripts y base.html.twig

Primeros pasos

Borremos el bundle de ejemplo

1. borrar la carpeta del bundle

2. quitar la referencia de AppKernel.php

3. quitar la ruta de routing.yml

Primeros pasos

Creemos un nuevo bundle

se puede hacer manualmente

pero es mejor usar console

app/console generate:bundle

generate:bundle

NameSpace: PHPday/DemoBundle

Name: DemoBundle

Target Directory: (default)

Configuration format: yml

El resto de las opciones: (default)

(enter, enter, enter, enter)

Que paso exactamente?

1. Se genero un Bundle :) (ver src/)

2. Se activo (ver AppKernel.php)

3. Se genero una ruta en app/config/routing.yml

(ya vamos a llegar a esto)

... pero antes...

* TIP *

Usar Git - colaboracion!

(o cualquier otro software de control de versiones)

Borremos .git

1. borrar la carpeta .git (rm -rf .git/)

2. inicializar git (git init)

2. agregar todos los archivos (git add .)

2. commit (git commit)

2. push (git push -u)

3. Routing

Toda pagina web necesita una URL

Crear una Ruta para cada Pagina

Esto se hace en el archivo app/config/routing.yml

Sigamos con nuestro ejemplo

En el ejemplo: app_dev.php/hello/PHPday

En el ejemplo: app_dev.php/hello/Montevideo

Esto funciona porque hay una ruta configurada

app/config/routing.yml

demo:
    resource: "@DemoBundle/Resources/config/routing.yml"
    prefix:   /

Donde esta la ruta /hello/PHPday ?

resource: "@DemoBundle/Resources/config/routing.yml"

resource = include

@ = busca en la carpeta src/

(donde estan todos nuestros bundles)

vemos el archivo src/DemoBundle/Resources/config/routing.yml

demo_homepage:
    path:     /hello/{name}
    defaults: { _controller: DemoBundle:Default:index }

path: /hello/{name}

Va a matchear todo lo que sea /hello/*

Es decir, /hello/CualquierCosa

Probemos cambiar a: /hola/{name}

Y en el browser vamos a: app_dev.php/hola/PHPday

* TIP *

path vs pattern

pattern = versiones viejas de Symfony

pattern les va a funcionar hasta Symfony 3.0

Empezar a usar path

volvamos a ver el archivo de configuracion de rutas src/DemoBundle/Resources/config/routing.yml

demo_homepage:
    path:     /hello/{name}
    defaults: { _controller: DemoBundle:Default:index }

La 2da parte critica es el controller por defecto

defaults: { _controller: DemoBundle:Default:index }

Le dice a Symfony que controller ejecutar cuando la ruta se matchea

En "criollo", un controlador es una funcion PHP

Una funcion que construye la pagina

(lo veremos a continuacion)

defaults: { _controller: DemoBundle:Default:index }

DemoBundle: el nombre del bundle

Default: Nombre de Clase del Controller

index: el nombre del Metodo

(similitud con OOP?)

defaults: { _controller: DemoBundle:Default:index }

Se refiere a:

DemoBundle\Default\Controller::indexAction

es decir, en el archivo

src/PHPday/DemoBundle/Controller/DefaultController.php

Hay un metodo indexAction:

namespace PHPday\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller {
    public function indexAction($name) {
        return $this->render('DemoBundle:Default:index.html.twig',
                array('name' => $name));
        }
}

La variable $name proviene del archivo de configuracion de Rutas src/DemoBundle/Resources/config/routing.yml

demo_homepage:
    path:     /hello/{name}
    defaults: { _controller: DemoBundle:Default:index }

en este caso:

return $this->render('DemoBundle:Default:index.html.twig',
    array('name' => $name));
}

retorna un template Twig renderizado pasando como parametro el {name} del routing.yml

Podemos tener multiples variables en la ruta

    path:     /hello/{nombre}/{ciudad}

Y accederlas en el metodo del controlador

class DefaultController extends Controller {
    public function indexAction($ciudad, $nombre) {
        return $this->render('DemoBundle:Default:index.html.twig',
            array('name' => $nombre, 'city' => $ciudad));
    }
}

* TIP *

$ php app/console router:debug

lista todas las rutas configuradas en la app

MUY importante a la hora de empezar a trabajar en una app que ya esta hecha y no conocen!

* TIP *

router:debug esta deprecado en Symfony 2.7

Se va a eliminar en Symfony 3

Usar debug:router

4. Controllers

Como se renderiza una pagina?

Basicamente 3 pasos:

1. Symfony busca la Ruta hasta que matchea un path

2. Symfony busca el _controller en esa Ruta

DemoBundle:Default:index - Se llama esa funcion

3. Se construye la pagina en indexAction()

El Controlador es donde "programamos" cosas

Ej: enviar emails, consultar una DB, procesar un formulario, etc

Es bien simple

Retorna un Symfony Response Object

Incluir el namespace Symfony\Component\HttpFoundation\Response

return new Response('Hola PHPday!!');

namespace PHPday\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class DefaultController extends Controller {
    public function indexAction($name) {
        return new Response('Hola PHPday!!');
    }
}

El Controlador:

1. Genera un contenido

2. Pone ese contenido en un Response

3. Retorna ese Response

Ej: Retornar un JSON

public function indexAction($name) {
    $datos = array(
        'nombre' => $name,
        'texto' => 'Hola PHPday!!'
    );
    $json = json_encode($datos);
    return new Response($datos);
}

* TIP *

Setear header Content-Type: application/json

asi:

Ej: Retornar un JSON (de verdad)

public function indexAction($name) {
    $datos = array(
        'nombre' => $name,
        'texto' => 'Hola PHPday!!'
    );
    $json = json_encode($datos);
    $respuesta = new Response($datos);
    $respuesta->headers->set('Content-Type', 'application/json');

    return $respuesta;
}

FELICITACIONES!

Ya saben programar en Symfony!!

5. Template

Veamos el metodo indexAction del Controlador

return $this->render('DemoBundle:Default:index.html.twig',
        array('name' => $name));

DemoBundle: el nombre del bundle

Default: Carpeta dentro de Resources/views

index.html.twig = template Twig!

Si abrimos ese archivo index.html.twig

Hello {{ name }}!

Este es nuestro template!

Escrito en Twig

Twig es un lenguaje de templates de Symfony

Hello {{ name }}!

Twig tiene basicamente 2 tipos de tags

en el ejemplo: Hello {{ name }}!

{{ name }}

es un tag para imprimir algo (el contenido de una variable "name" en este caso)

esta variable "name" es pasada al template desde el controller

{{ }} es como el "echo" de php

echo $var;

=

{{ var }}

El otro tipo de tag es {% %}

es el "hacer algo"

Ej: loops, definir variables, etc

Ej: {% for i in 1..5 %}

Ej:

{% for i in 1..5 %}
    {{ i }} Hello {{ name }}!
{% endfor %}

Twig es capaz de hacer muchas cosas

Ver http://twig.sensiolabs.org/documentation para ver una lista de Tags

Sabiendo esto basicamente ya podemos crear nuestros templates

y pasar variables desde el controller

Contenido dinamico

Hay otro tipo de tag

{# Un comentario! #}
{% for i in 1..5 %}
    {{ i }} Hello {{ name }}!
{% endfor %}

Hay mucho mas Twig

Filtros: {{ name|upper }}

(como los pipes de la terminal)

Ver http://twig.sensiolabs.org/documentation para ver una lista de Filtros

Nuestro template sigue siendo bastante basico

Si vemos el codigo fuente vamos a ver que no se parece mucho a un html

Podemos extender otros templates

Ej: base.html.twig

Veamos como hacer esto

{% extends '::base.html.twig' %}

{% block body %}
    {% for i in 1..5 %}
        {{ i }} Hello {{ name }}!
    {% endfor %}
{% endblock %}

Veamos el codigo fuente de la pagina ahora

"extends" indica que queremos usar un template como base y acoplar el contenido de nuestro template a ese otro

"block" indica donde queremos renderizar nuestro template

si miramos base.html.twig vamos a ver que hay varios bloques predefinidos

al usar "block body" estamos diciendo que en ese lugar queremos renderizar nuestro template

nuestro contenido va a ir ahi en ese lugar

ver otros bloques en base.html.twig

podemos mostrar nuestro contenido en cualquiera de esos bloques

podemos crear nuestros propios bloques

con Twig podemos personalizar nuestros HTMLs

y mostrar contenido generado dinamicamente en nuestras paginas

Bonus Track!

La Toolbar de Symfony 2

Web Debug Toolbar

Nos dice que controller fue usado

Tiempo de carga de la pagina, uso de memoria, seguridad, etc

Se agrega automaticamente en cada html

Profiler

Timeline

Eventos Symfony en cada request

Mas?

http://symfony.com

http://twig.sensiolabs.org

Resumen

Que es Symfony?

1. Conjunto de Componentes que podemos usar en cualquier aplicacion PHP

2. Un framework

3. Comunidad

4. Filosofia (para los mas fanaticos)

Instalacion?

1. Descargar de symfony.com/downloads

2. Seguir los pasos de la documentacion

Crear un proyecto?

1. symfony new mi-proyecto

2. Agregan un bundle app/console generate:bundle

(esto genera la Ruta y el Controlador)

Personalizar la ruta

1. en el archivo routing.yml

Comenzar a Programar!

1. empiecen en el Controlador

Usar un diseño HTML

1. Twig!

2. Templates en la carpeta Resources/views de cada Bundle

Gracias!

Preguntas?

Twitter: @vallejosfab

Blog: http://fabianvallejos.com

Slides: https://github.com/vallejos/phpday-2015-symfony-presentation

Codigo Fuente: https://github.com/vallejos/phpday-2015-symfony-demo

Introduccion a Symfony Por Fabian Vallejos / @vallejosfab