Por Fabian Vallejos / @vallejosfab
Hablemos de
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
1. Que es Symfony?
2. Instalacion / Configuracion
3. Routing
4. Controllers
5. Templates
Ejemplo Symfony 2.7
Recomendaciones, Tips, Mejores Practicas
Bundles, Forms
Databases, Doctrine, ORM
Seguridad, Traduccion, Internalizacion
Dependency Injection
Assetic, Cache, Testing, Deployment
Documentacion, Comunidad
... Mucho Mas!
No hay tiempo para todo
Framework PHP
desarrollado por
(de los mas usados)
Top PHP projects en GitHub!
Gran comunidad!
Libreria de Componentes
Traduccion:
Se puede usar cualquier parte de Symfony en cualquier proyecto PHP
Asset
Console
Finder
Routing
Ver mas: http://symfony.com/components
Asset: js, css, images Routing: mapeo de rutas a variables Finder: busca files y foldersDrupal
Laravel
Magento
phpBB
Joomla
Silex
Ver mas: http://symfony.com/projects
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/
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.
PHP >= 5.3.9
Habilitar JSON y ctype
Setear date.timezone en el php.ini
PHP-XML, libxml, mbstring, Intl, y otros mas...
Mas info: http://symfony.com/doc/current/reference/requirements.html
Seteos recomendados en php.ini
short_open_tag = Off magic_quotes_gpc = Off register_globals = Off session.auto_start = Off
Instalar PDO y el driver PDO que vayan a usar
(ej: pdo-mysql para usar MySQL)
* Tip* : No usar mysql_connect()
Se puede verificar si tu sistema "soporta" Symfony:
Cargar en el navegador web/config.php o ejecutando desde la terminal:
$ php app/check.php
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)
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
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
Creemos un nuevo bundle
se puede hacer manualmente
pero es mejor usar console
app/console generate:bundle
NameSpace: PHPday/DemoBundle
Name: DemoBundle
Target Directory: (default)
Configuration format: yml
El resto de las opciones: (default)
(enter, enter, enter, enter)
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...
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)
Toda pagina web necesita una URL
Crear una Ruta para cada Pagina
Esto se hace en el archivo app/config/routing.yml
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
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
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!!
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
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?
1. Conjunto de Componentes que podemos usar en cualquier aplicacion PHP
2. Un framework
3. Comunidad
4. Filosofia (para los mas fanaticos)
1. Descargar de symfony.com/downloads
2. Seguir los pasos de la documentacion
1. symfony new mi-proyecto
2. Agregan un bundle app/console generate:bundle
(esto genera la Ruta y el Controlador)
1. en el archivo routing.yml
1. empiecen en el Controlador
1. Twig!
2. Templates en la carpeta Resources/views de cada Bundle
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