SlideShare uma empresa Scribd logo
1 de 150
Baixar para ler offline
Silex
  desarrollo web ágil y
  profesional con PHP

BILBOSTACK          JAVIER EGUILUZ
26 ENERO 2013
Gracias a la organización.



Asier   Fran     Ibon    Vicenç
Agenda
 1. Introducción
 2. Programando aplicaciones
 3. DEMO
 4. Buenas prácticas
 5. Puntos débiles
Introducción
¿Por qué?
En el mundo de los negocios...
1. Rápido
2. Barato
3. Bueno
En el mundo de los negocios...
1. Rápido              ELIGE DOS

2. Barato
3. Bueno
En el mundo de la programación...
1. Bien hecho
2. Terminado a tiempo
3. Barato
En el mundo de la programación...
1. Bien hecho     ELIGE UNA

2. Terminado a tiempo
3. Barato
En el mundo de la programación...
✔ Bien
1.     hecho
✔ Terminado a tiempo
2.
✔ Barato
3.
   Con Silex puedes
   tenerlo todo
¡no tengo
¡quiero hacerlo bien!    tiempo!
¿Qué es
 Silex?
Foto: Wikipedia
Curiosity (2012)




                  Sojourner (2007)
Foto: Wikipedia
Sojourner   Curiosity
                (2007)      (2012)

Masa            11 kg      900 kg
Coste ($)      150 M      1.800 M
Memoria RAM     64 KB      256 MB
CPU             2 MHz     200 MHz
Es importante tener en cuenta que...
• El grande jamás podrá ser tan ágil
  como el pequeño.
• El pequeño jamás podrá competir
  en potencia y funcionalidad con el
  grande.
Silex
The PHP micro-framework
based on the Symfony2
Components

                           el logo
                          de Silex
los dos son frameworks y usan los mismos componentes, pero...
...Symfony es un framework muy grande y Silex es un framework muy pequeño
Silex   Symfony2
Peso               5 MB      8 MB
Archivos           3.366    6.578
Nivel dificultad

Flexibilidad
Los creadores de Silex




Igor Wiedler     Fabien Potencier
@igorw           @fabpot
+ fácil     + calidad
- calidad   - facil
+ fácil     + calidad
- calidad   - facil
Programando
 aplicaciones
Funciones anónimas
         y closures
Función normal
function suma($a, $b) {
  return $a + $b;
}
Función anónima
function ($a, $b) {
  return $a + $b;
}
Usando una función anónima
$app->get('...', function ($a, $b) {
   return $a + $b;
});
Closure
$a = 3;
function ($b) {
  return $a + $b;
}
Closure
$a = 3;             NO FUNCIONA
function ($b) {
  return $a + $b;
}
Closure
$a = 3;
function ($b) use ($a) {
  return $a + $b;
}
El código más común de Silex
$app->get('...', function ($var) use ($app) {
   // ...
});
El primer
 ejemplo
Hola
mundo.
http://bilbostack.com/hola
Hola Mundo en Silex
require_once __DIR__.'/../vendor/autoload.php';

$app = new SilexApplication();

$app->get('/hola', function() {
   return 'Hola mundo';
});

$app->run();
Cargar clases automáticamente
require_once __DIR__.'/../vendor/autoload.php';

$app = new SilexApplication();

$app->get('/hola', function() {
   return 'Hola mundo';
});

$app->run();
Crear la aplicación Silex
require_once __DIR__.'/../vendor/autoload.php';

$app = new SilexApplication();

$app->get('/hola', function() {
   return 'Hola mundo';
});

$app->run();
Ejecutar código para una URL
require_once __DIR__.'/../vendor/autoload.php';

$app = new SilexApplication();

$app->get('/hola', function() {
   return 'Hola mundo';
});

$app->run();
Arrancar la aplicación
require_once __DIR__.'/../vendor/autoload.php';

$app = new SilexApplication();

$app->get('/hola', function() {
   return 'Hola mundo';
});

$app->run();
Hola Mundo en Silex
require_once __DIR__.'/../vendor/autoload.php';

$app = new SilexApplication();

$app->get('/hola', function() {
   return 'Hola mundo';
});

$app->run();
Sinatra / Ruby

require 'sinatra'

get '/hola' do
 "Hola mundo."
end
node.js / JavaScript

var http = require('http');

http.createServer(function (request, response) {
   response.writeHead(
      200, { 'Content-Type': 'text/plain' }
   );
   response.end('Hola mundon');
}).listen(80);
Un ejemplo
       real
Fo
                     rk
                          m
                           eo
                              n
github.com/                       Gi
                                    tH
                                      ub

javiereguiluz/bilbostack
Enrutamiento
Ruta de la portada
$app->get('/', function () use ($app) {
   // ...
});
Ruta básica
$app->get('/agenda', function () use ($app) {
   // ...
});
Ruta con partes variables
$app->get('/speakers/{slug}', function ()
                              use ($app) {
   // ...
});
Ruta con partes variables
$app->get('/speakers/{slug}', function ()
                              use ($app) {
   // ...
});
Ruta con partes variables
$app->get('/speakers/{slug}', function ()
                              use ($app) {
   // ...
});

/speakers/pablo-garaizar
/speakers/carlos-sanchez
/speakers/esto-esta-mal
Otros métodos HTTP
$app->post('/registro', function () use ($app) {
   // ...
});
Otros métodos HTTP
$app->post('/registro', function () use ($app) {
   // ...
});

$app->put( );
$app->delete( );
Ruta para todos los métodos HTTP
$app->match('/registro', function () use ($app) {
   // ...
});
Ruta para algunos métodos HTTP
$app->match('/registro', function () use ($app) {
   // ...
})
->method('GET|POST');
Rutas con variables
$app->get('/speakers/{slug}', function ($slug) {
   // ...
});
Rutas con variables
$app->get('/speakers/{track}/{slug}',
         function ($track, $slug) use ($app) {
   // ...
});
Variables especiales
use SymfonyComponentHttpFoundationRequest;

$app->get('/speakers/{slug}',
         function (Request $request, $slug) {
   // ...
});
Variables especiales
use SymfonyComponentHttpFoundationRequest;

$app->get('/speakers/{slug}',
         function (Request $request, $slug) {
   // ...
});
Variables especiales
use SymfonyComponentHttpFoundationRequest;

$app->get('/speakers/{slug}',
         function (Request $request, $slug) {
   // ...
});

$request->server->get('HTTP_USER_AGENT')
$request->get('slug')
Modificando las variables de la ruta
$app->get('/schedule/{slug}',
         function ($slug) use ($app) {
   // ...
})->convert('slug', function ($slug) {
   return strtolower($slug);
});
Modificando las variables de la ruta
$app->get('/schedule/{slug}',
         function ($slug) use ($app) {
   // ...
})->convert('slug', function ($slug) {
   return str_replace('-', '_', $slug);
});
Restringiendo las variables de la ruta
$app->get('/schedule/{track}', function ($track)
{
  // ...
})->assert('track', 'd+');
Restringiendo las variables de la ruta
$app->get('/schedule/{track}', function ($track)
{
  // ...
})->assert('track', 'trackd+');
Restringiendo las variables de la ruta
$app->get('/schedule/{track}', function ($track)
{
  // ...
})->assert('track', '1|2');
Valores por defecto
$app->get('/schedule/{track}', function ($track)
{
  // ...
})->value('track', '1');
Valores por defecto
$app->get('/schedule/{track}', function ($track)
{
  // ...
})->value('track', '1');

/schedule
/schedule/1
Rutas con nombre
$app->get('/', function () use ($app) {
  // ...
})->bind('portada');
Controladores
Controlador básico
$app->get('/donde-comer', function ()
                             use ($app) {
   return $app['twig']->render('comer.twig');
})
->bind('comer');
Controlador típico
$app->get('/', function () use ($app) {
  $ponentes = $app['ponentes'];

  return $app['twig']->render('portada.twig',
         array('ponentes' => $ponentes)
  );
})->bind('portada');
Controlador típico
$app->get('/', function () use ($app) {
  $ponentes = $app['ponentes'];

  return $app['twig']->render('portada.twig',
         array('ponentes' => $ponentes)
  );
})->bind('portada');
Gestión de errores
$app->get('/speakers/{slug}',
      function ($slug) use ($app) {
  if (...) {
      $app->abort(404, "No existe el ponente.");
  }

  // ...

  return $app['twig']->render('ponente.twig',...);
})->bind('ponente');
Gestión de errores
$app->get('/speakers/{slug}',
      function ($slug) use ($app) {
  if (...) {
      $app->abort(404, "No existe el ponente.");
  }

  // ...

  return $app['twig']->render('ponente.twig',...);
})->bind('ponente');
Controlador especial para errores
$app->error(function (Exception $e, $code)
            use ($app) {

  // ...

});
Controlador especial para errores
$app->error(function (Exception $e, $code)
            use ($app) {

  // ...

});
Esqueleto de una aplicación Silex
$app->get('/', ...)->bind('portada');

$app->get('/agenda', ...)->bind('agenda');

$app->get('/speakers/{slug}', ...)
->bind('ponente');

$app->get('/schedule/{slug}', ...)
->bind('ponencia');
1 aplicación = 1 archivo
$app->get('/', ...)->bind('portada');

$app->get('/agenda', ...)-
>bind('agenda');

$app->get('/speakers/{slug}', ...)
->bind('ponente');

$app->get('/schedule/{slug}', ...)
->bind('ponencia');




                 controllers.php
1 aplicación = 1 archivo

                                        EL ORDEN
$app->get('/', ...)->bind('portada');

$app->get('/agenda', ...)-
>bind('agenda');                         IMPORTA
$app->get('/speakers/{slug}', ...)
->bind('ponente');

$app->get('/schedule/{slug}', ...)
->bind('ponencia');




                 controllers.php
Middlewares
     (filtros)
Petición HTTP           Objeto Request



                    Silex



                            Tu aplicación




Página HTML         Silex
                            Objeto Response
Petición HTTP           Objeto Request

                                     !
                    Silex



                            Tu aplicación

         !                            !

Página HTML         Silex
                            Objeto Response
Filtro before
$app->before(function (Request $request) {
   // ...
});
Secuencia de ejecución
• Buscar la ruta que pide el usuario.
• Comprobar la seguridad.
• Ejecutar filtro before()
• Ejecutar controlador de la ruta
Ejemplo de filtro before
$app->before(function (Request $request) {
   if (...) {
       return new RedirectResponse('/login');
   }
});
Filtro after
$app->after(function (Request $request,
                      Response $response) {
   // ...
});
Secuencia de ejecución
• Buscar la ruta que pide el usuario.
• Comprobar la seguridad.
• Ejecutar filtro before( )
• Ejecutar controlador de la ruta.
• Ejecutar filtro after( )
• Enviar respuesta al usuario.
Ejemplo de filtro after
$app->after(function (Request $request) {
   log('...');
});
Ejemplo de filtro after
$app->after(function (Request $request) {
   log('...');
});

                 ¿Dónde está mi
                   respuesta?
Filtro finish
$app->finish(function (Request $request,
                       Response $response) {
   // ...
});
Cada ruta con su filtro
$app->get('/', ...)->bind('portada')->before(...);

$app->get('/agenda', ...)->bind('agenda')
->before(...)->after(...);

$app->get('/speakers/{slug}', ...)
->bind('ponente')->before(...);

$app->get('/schedule/{slug}', ...)
->bind('ponencia')->before(...);
Proveedores de
      servicios
Bases de datos


           Formularios

Núcleo     Plantillas

de Silex   Caché HTTP


           Envío de emails

             proveedores
Bases de datos


                        Formularios

Núcleo     Plantillas

de Silex                Caché HTTP


                        Envío de emails

                          proveedores
Bases de datos


           Formularios

Núcleo                   Plantillas

de Silex                 Caché HTTP


                      Envío de emails

                            proveedores
Bases de datos


           Formularios

Núcleo     Plantillas

de Silex   Caché HTTP


           Envío de emails
Bases de datos   Serializador   Seguridad


Formularios      Logger         Sesiones


Validación       Emails         Plantillas


Caché HTTP       URL
Usar formularios de Symfony2
use SilexProviderFormServiceProvider;

// ...

$app->register(new FormServiceProvider());
Acceder a BBDD con Doctrine2
use SilexProviderDoctrineServiceProvider;

// ...

$app->register(new DoctrineServiceProvider());
Utilizar las plantillas de Twig
use SilexProviderTwigServiceProvider;

// ...

$app->register(new TwigServiceProvider(), array(
  'twig.path' => array(__DIR__.'/../templates'),
  'twig.options' => array('...'),
));
DEMO
github.com/javiereguiluz/bilbostack




                                                ub
                                          G itH
                                   e on
                                k m
                            F or
Instalación
Descargar archivo comprimido

   silex.sensiolabs.org
Descargar archivo comprimido
Descargar archivo comprimido
Descargar archivo comprimido
Instalación via composer.json
{
  "require": {
     "silex/silex": "1.0.*"
  },
  "minimum-stability": "dev"
}
Instalación via composer.json
{
  "require": {
     "fabpot/silex-skeleton": "*"
  },
  "minimum-stability": "dev"
}
Instalación recomendada
$ composer
  create-project
  fabpot/silex-skeleton
  --stability=dev
web/        src/      src/
index.php   app.php   controllers.php
web/        src/      src/
index.php   app.php   controllers.php




No tocar
web/        src/        src/
index.php   app.php     controllers.php




No tocar     Activas
            servicios
web/        src/        src/
index.php   app.php     controllers.php




No tocar     Activas       $app
            servicios   ->get('/', ...});
Buenas
prácticas
Organizando
los controladores
$app->get('/', ...);

                         // ...


                                  controllers.php

$app->get('/', ...);     $app->get('/', ...);



              blog.php              backend.php
Importando controladores
$app->mount('/blog', include 'blog.php');
$app->mount('/admin', include 'backend.php');
Importando controladores
$app->mount('/blog', include 'blog.php');
$app->mount('/admin', include 'backend.php');
Importando controladores
$app->mount('/blog', include 'blog.php');
$app->mount('/admin', include 'backend.php');


PORTADA: /
PORTADA DE BLOG: /blog/
PORTADA DE BACKEND: /admin/
1 aplicación = 1 archivo
$app->get('/', ...)->bind('portada');

$app->get('/agenda', ...)-
>bind('agenda');

$app->get('/speakers/{slug}', ...)
->bind('ponente');

$app->get('/schedule/{slug}', ...)
->bind('ponencia');




                 controllers.php
1 aplicación pequeña = 1 archivo
$app->get('/', ...)->bind('portada');

$app->get('/agenda', ...)-
>bind('agenda');

$app->get('/speakers/{slug}', ...)
->bind('ponente');

$app->get('/schedule/{slug}', ...)
->bind('ponencia');




                 controllers.php
1 aplicación mediana = N archivos
$app->get('/', ...)->bind('portada');   $app->get('/', ...);

$app->get('/agenda', ...)-              $app->get('/ver', ...);
>bind('agenda');
                                        $app->get('/listar', ...);
$app->get('/speakers/{slug}', ...)
->bind('ponente');
                                                                     blog.php
$app->get('/schedule/{slug}', ...)
->bind('ponencia');



                                        $app->get('/', ...);




                 controllers.php                               backend.php
Escalando una
aplicación Silex
Controladores como clases
namespace IgorwShopController;

use SilexApplication;
use SymfonyComponentHttpFoundationRequest;

class ShopController
{
   public function indexAction(Request $request, Application $app)
   {
     ...
   }
}
Controladores como clases
$app->get('/', controller('shop/index'));
$app->match('/login', controller('shop/login'));
$app->get('/product', controller('shop/
product'));
http://igor.io/2012/11/09/scaling-silex.html
Puntos
débiles
i18n   Depuración

ORM    Documentación

ESI
i18n (internacionalización)
• Fácil traducir contenidos
  {{ "Hola Mundo"|trans }}
• No es cómodo traducir rutas y
  contenidos de la base de datos.
ORM
• No hay soporte oficial del ORM
 completo (Doctrine2).
• No hay ORM alternativos ligeros.
• Si tu aplicación necesita un ORM,
 puede ser demasiado grande para
 Silex.
Depuración
// activar el modo debug
$app['debug'] = true;

// activar el log
use SilexProviderMonologServiceProvider;

$app->register(new MonologServiceProvider(),
array(
    'monolog.logfile' => __DIR__.'/../logs/dev.log',
));
Mensajes de error
ESI
• Silex incluye soporte de ESI.
• Su uso es bastante incómodo
  (comparado con Symfony2).
Documentación
• Todas las características de Silex
  están documentadas.
• No es tan abundante como la de
  Symfony2.
Documentación
• Oficial
  silex.sensiolabs.org/documentation
• Traducción
  librosweb.es/silex
Conclusiones
Conclusiones
• Silex es un microframework, pero no es
  un juguete.
Conclusiones
• Silex es un microframework, pero no es
  un juguete.
• Silex sirve para cualquier aplicación
  web que no sea enorme.
Conclusiones
• Silex es un microframework, pero no es
  un juguete.
• Silex sirve para cualquier aplicación
  web que no sea enorme.
• Silex reduce a “horas” el tiempo de
  desarrollo de aplicaciones enteras.
Conclusiones
• Silex es un microframework, pero no es
  un juguete.
• Silex sirve para cualquier aplicación
  web que no sea enorme.
• Silex reduce a “horas” el tiempo de
  desarrollo de aplicaciones enteras.
• Silex combina la agilidad de PHP con la
  profesionalidad de Symfony.
GRACIAS.
Contacto
         • javier.eguiluz@gmail.com
         • twitter.com/javiereguiluz
         • github.com/javiereguiluz
         • linkedin.com/in/javiereguiluz



domingo, 27 de enero de 13

Mais conteúdo relacionado

Mais procurados

Slides components en
Slides components enSlides components en
Slides components en
Javier López
 
Curso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalCurso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en Drupal
Mediaglobe Innova
 
Api De Google Calendar
Api De Google CalendarApi De Google Calendar
Api De Google Calendar
jvelizster
 
Ejemplos de php_mysql
Ejemplos de php_mysqlEjemplos de php_mysql
Ejemplos de php_mysql
I LG
 
Php excel
Php excelPhp excel
Php excel
pcuseth
 
Programa que almacena en una base de datos las características de un carro co...
Programa que almacena en una base de datos las características de un carro co...Programa que almacena en una base de datos las características de un carro co...
Programa que almacena en una base de datos las características de un carro co...
jbersosa
 

Mais procurados (20)

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...
 
WordCamp Cantabria - Código mantenible con WordPress
WordCamp Cantabria  - Código mantenible con WordPressWordCamp Cantabria  - Código mantenible con WordPress
WordCamp Cantabria - Código mantenible con WordPress
 
RabbitMQ y Symfony
RabbitMQ y SymfonyRabbitMQ y Symfony
RabbitMQ y Symfony
 
Slides components en
Slides components enSlides components en
Slides components en
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Wp config.php
Wp config.phpWp config.php
Wp config.php
 
Curso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalCurso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en Drupal
 
PHP Tema 2 - Lenguaje PHP básico
PHP Tema 2 - Lenguaje PHP básicoPHP Tema 2 - Lenguaje PHP básico
PHP Tema 2 - Lenguaje PHP básico
 
Api De Google Calendar
Api De Google CalendarApi De Google Calendar
Api De Google Calendar
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain
 
Introducción a Flask
Introducción a FlaskIntroducción a Flask
Introducción a Flask
 
Introducción a DJango
Introducción a DJangoIntroducción a DJango
Introducción a DJango
 
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
 
Ejemplos de php_mysql
Ejemplos de php_mysqlEjemplos de php_mysql
Ejemplos de php_mysql
 
Php
PhpPhp
Php
 
Introducción a los hooks
Introducción a los hooksIntroducción a los hooks
Introducción a los hooks
 
Materiales del curso de Symfony2
Materiales del curso de Symfony2Materiales del curso de Symfony2
Materiales del curso de Symfony2
 
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y AngularDesarrollo Web Ágil con Symfony, Bootstrap y Angular
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
 
Php excel
Php excelPhp excel
Php excel
 
Programa que almacena en una base de datos las características de un carro co...
Programa que almacena en una base de datos las características de un carro co...Programa que almacena en una base de datos las características de un carro co...
Programa que almacena en una base de datos las características de un carro co...
 

Destaque

Parque De Agua Web - Propuesta
Parque De Agua Web - PropuestaParque De Agua Web - Propuesta
Parque De Agua Web - Propuesta
elrofes
 
Propuesta diseño web
Propuesta diseño webPropuesta diseño web
Propuesta diseño web
darwpinorozco
 
DESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEBDESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEB
Javier Condori Flores
 
Iniciación PHP 5. Programación Orientada a Objetos
Iniciación PHP 5. Programación Orientada a ObjetosIniciación PHP 5. Programación Orientada a Objetos
Iniciación PHP 5. Programación Orientada a Objetos
Rightster
 

Destaque (20)

Silex para aplicaciones web MVC
Silex para aplicaciones web MVCSilex para aplicaciones web MVC
Silex para aplicaciones web MVC
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
 
Introducción a Silex
Introducción a SilexIntroducción a Silex
Introducción a Silex
 
Create - Decoupled CMS interface
Create - Decoupled CMS interfaceCreate - Decoupled CMS interface
Create - Decoupled CMS interface
 
Parque De Agua Web - Propuesta
Parque De Agua Web - PropuestaParque De Agua Web - Propuesta
Parque De Agua Web - Propuesta
 
Propuesta diseño web
Propuesta diseño webPropuesta diseño web
Propuesta diseño web
 
Propuesta web
Propuesta webPropuesta web
Propuesta web
 
Propuesta web 2.0 greatest (f)
Propuesta web 2.0 greatest (f)Propuesta web 2.0 greatest (f)
Propuesta web 2.0 greatest (f)
 
MVC
MVCMVC
MVC
 
Febrero 2009 - Presentación PFC AGritos!
Febrero 2009 - Presentación PFC AGritos!Febrero 2009 - Presentación PFC AGritos!
Febrero 2009 - Presentación PFC AGritos!
 
Presentación Framework CodeIgniter
Presentación Framework CodeIgniter Presentación Framework CodeIgniter
Presentación Framework CodeIgniter
 
DESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEBDESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEB
 
Iniciación PHP 5. Programación Web
Iniciación PHP 5. Programación WebIniciación PHP 5. Programación Web
Iniciación PHP 5. Programación Web
 
MODELO VISTA CONTROLADOR EN PHP
MODELO VISTA CONTROLADOR EN PHPMODELO VISTA CONTROLADOR EN PHP
MODELO VISTA CONTROLADOR EN PHP
 
Curso php y_my_sql
Curso php y_my_sqlCurso php y_my_sql
Curso php y_my_sql
 
Iniciación PHP 5. Introducción
Iniciación PHP 5. IntroducciónIniciación PHP 5. Introducción
Iniciación PHP 5. Introducción
 
Iniciación PHP 5. Programación Orientada a Objetos
Iniciación PHP 5. Programación Orientada a ObjetosIniciación PHP 5. Programación Orientada a Objetos
Iniciación PHP 5. Programación Orientada a Objetos
 
Propuesta Portal Web
Propuesta Portal WebPropuesta Portal Web
Propuesta Portal Web
 
Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)Twig avanzado (sf2Vigo)
Twig avanzado (sf2Vigo)
 
Iniciación PHP 5. Ejercicios
Iniciación PHP 5. EjerciciosIniciación PHP 5. Ejercicios
Iniciación PHP 5. Ejercicios
 

Semelhante a Silex, desarrollo web ágil y profesional con PHP

Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
Javier P.
 
PostgreSQL À la Debian
PostgreSQL À la DebianPostgreSQL À la Debian
PostgreSQL À la Debian
Leonardo Cezar
 
Introducción a phone gap
Introducción a phone gapIntroducción a phone gap
Introducción a phone gap
Rodrigo Corral
 

Semelhante a Silex, desarrollo web ágil y profesional con PHP (20)

Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevilla
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
PostgreSQL À la Debian
PostgreSQL À la DebianPostgreSQL À la Debian
PostgreSQL À la Debian
 
PostgreSQL À la Debian
PostgreSQL À la DebianPostgreSQL À la Debian
PostgreSQL À la Debian
 
Symfony: Domesticando las Vistas - decharlas
Symfony: Domesticando las Vistas - decharlasSymfony: Domesticando las Vistas - decharlas
Symfony: Domesticando las Vistas - decharlas
 
Symfony: Domesticando las Vistas
Symfony: Domesticando las VistasSymfony: Domesticando las Vistas
Symfony: Domesticando las Vistas
 
Laravel 5.1
Laravel 5.1Laravel 5.1
Laravel 5.1
 
(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery
 
JAVASCRIPT.pptx
JAVASCRIPT.pptxJAVASCRIPT.pptx
JAVASCRIPT.pptx
 
Introducción a phone gap
Introducción a phone gapIntroducción a phone gap
Introducción a phone gap
 
9.laravel
9.laravel9.laravel
9.laravel
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipster
 
Symfony 2 CMF
Symfony 2 CMFSymfony 2 CMF
Symfony 2 CMF
 
Creación de plugins con Grails
Creación de plugins con GrailsCreación de plugins con Grails
Creación de plugins con Grails
 
Curso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzadosCurso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzados
 
Introducción al framework Symfony
Introducción al framework SymfonyIntroducción al framework Symfony
Introducción al framework Symfony
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQuery
 

Mais de Javier Eguiluz

Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8
Javier Eguiluz
 
Twig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasTwig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadas
Javier Eguiluz
 

Mais de Javier Eguiluz (17)

deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de SymfonydeSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
 
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
 
Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)Mastering Twig (DrupalCon Barcelona 2015)
Mastering Twig (DrupalCon Barcelona 2015)
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
 
Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8
 
Silex al límite
Silex al límiteSilex al límite
Silex al límite
 
Twig tips and tricks
Twig tips and tricksTwig tips and tricks
Twig tips and tricks
 
Twig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadasTwig, los mejores trucos y técnicas avanzadas
Twig, los mejores trucos y técnicas avanzadas
 
Wallpaper Notifier
Wallpaper NotifierWallpaper Notifier
Wallpaper Notifier
 
Desymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseñoDesymfony 2012 - Concurso de diseño
Desymfony 2012 - Concurso de diseño
 
Desymfony 2011 - Twig
Desymfony 2011 - TwigDesymfony 2011 - Twig
Desymfony 2011 - Twig
 
Curso Symfony - Anexos
Curso Symfony - AnexosCurso Symfony - Anexos
Curso Symfony - Anexos
 
Curso Symfony - Clase 5
Curso Symfony - Clase 5Curso Symfony - Clase 5
Curso Symfony - Clase 5
 
Curso Symfony - Clase 4
Curso Symfony - Clase 4Curso Symfony - Clase 4
Curso Symfony - Clase 4
 
Curso Symfony - Clase 3
Curso Symfony - Clase 3Curso Symfony - Clase 3
Curso Symfony - Clase 3
 
Curso Symfony - Clase 2
Curso Symfony - Clase 2Curso Symfony - Clase 2
Curso Symfony - Clase 2
 
Curso Symfony - Clase 1
Curso Symfony - Clase 1Curso Symfony - Clase 1
Curso Symfony - Clase 1
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Último (11)

Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 

Silex, desarrollo web ágil y profesional con PHP