Silex - Talk is cheap, show me the c̶o̶d̶e̶ prototype!

Silex - Talk is cheap, show me the c̶o̶d̶e̶ prototype!

Por que prototipar?
O que são microframeworks?
Silex, microframework PHP.
Como usar o Silex?

Dd958da4c68b7d3227b3f1cd92a429a6?s=128

Jean Pimentel

June 25, 2012
Tweet

Transcript

  1. None
  2. JEAN PIMENTEL Ciência da Computação – UFJF Analista de Sistemas

    – Bolt Brasil @jeanpimentel
  3. IDEIAS NÃO VALEM NADA!

  4. Etapas pra produzir sua ideia: 1. Ideia 2. Documentação 3.

    Mockups 4. Protótipos 5. Vídeos
  5. POR QUE PROTOTIPAR?

  6. None
  7. "IT'S ONE THING TO TALK ABOUT THEM AND HAVE STORYBOARDS

    AND ANOTHER THING TO SEE THEM FOR REAL.“ ROBERT HOEKMAN, JR.
  8. None
  9. POR MELHOR QUE VOCÊ SEJA, SEMPRE COMETERÁ ERROS.

  10. VOCÊ NÃO PRECISA FAZER TUDO, SOMENTE O PRINCIPAL.

  11. TERMINE O PROTÓTIPO EM 1 DIA.

  12. ITERAÇÕES: REESTUDE O PROBLEMA, REPENSE A SOLUÇÃO.

  13. NÃO PERCA TEMPO COM O MELHOR CÓDIGO, ELE É DESCARTÁVEL

    E SOFRERÁ MUITAS ALTERAÇÕES.
  14. NÃO PERCA TEMPO COM O MELHOR CÓDIGO, ELE É DESCARTÁVEL

    E SOFRERÁ MUITAS ALTERAÇÕES. NÃO PRECISA FUNCIONAR NO IE6, NEM TER UM BOM HTML. PODE ATÉ USAR TABELA.
  15. MICROFRAMEWORK

  16. MICROFRAMEWORK • Esqueleto da aplicação • Controllers (MVC) – Rotas

     Ações – Requests  Responses • Simples
  17. MICROFRAMEWORK • Ruby  Sinatra, Cuba • Python  Flask,

    Pyramid • PHP  Silex, Slim, Flight • Java  Napalm
  18. SILEX

  19. SILEX • Não é o Symfony2 • PHP 5.3 •

    PSR-0 • PSR-1 (?) • PSR-2 (?) • Conciso, extensível e testável
  20. COMO USAR

  21. 1 { 2 "require": { 3 "php": ">=5.3.2", 4 "silex/silex":

    "*" 5 } 6 } 1 curl -s http://getcomposer.org/installer | php 2 php composer.phar install composer.json shell
  22. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 8 // SEUS MÉTODOS AQUI 9 10 $app->run(); public/index.php
  23. SERVICE PROVIDERS

  24. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 // SEUS MÉTODOS AQUI 13 14 $app->run();
  25. SERVICES PROVIDERS • Validator • Form • Monolog • Doctrine

    • Translation • E você pode fazer o seu. Basta implementar uma interface.
  26. ROUTING

  27. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->get('/posts', function () { 13 $posts = /* Minha query */ 14 15 $output = ''; 16 foreach ($posts as $post) 17 $output .= $post['title'] . '<br />'; 18 19 return $output; 20 }); 21 22 $app->run();
  28. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->get('/posts', function () use ($app) { 13 $posts = /* Minha query */ 14 return $app['twig']->render('blog.twig', array('posts' => $posts)); 15 }); 16 17 $app->run(); 1 {% if posts %} 2 <ul> 3 {% for post in posts %} 4 <li>{{ post.title }}<li> 5 {% endfor %} 6 </ul> 7 {% endif %} UTILIZANDO O TWIG views/blog.twig
  29. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->get('/posts', function () use ($app) { 13 $posts = /* Minha query */ 14 return $app['twig']->render('blog.twig', array('posts' => $posts)); 15 }); 16 17 $app->get('/post/{id}', function ($id) use ($app) { 18 $post = /* Minha query buscando o post */ 19 return $app['twig']->render('post.twig', array('post' => $post)); 20 }) 21 ->assert('id', '\d+'); 22 23 $app->run(); UTILIZANDO PARÂMETROS
  30. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->get('/posts', function () use ($app) { 13 $posts = /* Minha query */ 14 return $app['twig']->render('blog.twig', array('posts' => $posts)); 15 }); 16 17 $app->get('/post/{id}', function ($id) use ($app) { 18 return $app['twig']->render('post.twig', array('post' => $id)); 19 }) 20 ->convert('id', function ($id) { return /* Minha query buscando post */ }); 21 22 $app->run(); CONVERTENDO O PARÂMETRO
  31. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $postProvider = function ($id) { 13 return /* Minha query buscando post */ 14 }; 15 16 $app->get('/posts', function () use ($app) { 17 $posts = /* Minha query */ 18 return $app['twig']->render('blog.twig', array('posts' => $posts)); 19 }); 20 21 $app->get('/post/{id}', function ($id) use ($app) { 22 return $app['twig']->render('post.twig', array('post' => $id)); 23 }) 24 ->convert('id', $postProvider); 25 26 $app->run(); REUTILIZANDO FUNÇÕES
  32. 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5 6 $app

    = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $postProvider = function ($id) { 13 return /* Minha query buscando o post */ 14 }; 15 16 $app->get('/posts', function () use ($app) { 17 $posts = /* Minha query */ 18 return $app['twig']->render('blog.twig', array('posts' => $posts)); 19 }); 20 21 $app->get('/post/{id}', function ($id) use ($app) { 22 return $app['twig']->render('post.twig', array('post' => $id)); 23 }) 24 ->convert('id', $postProvider); 25 26 $app->get('/posts/categoria/{categoria}', function ($id) use ($app) { 27 $posts = /* Minha query por posts com categoria X */ 28 return $app['twig']->render('blog.twig', array('posts' => $posts)); 29 }) 30 ->value('categoria', 'php'); 31 32 $app->run(); PARÂMETROS COM VALOR DEFAULT
  33. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 /* ... */ 13 14 $app->get('/contato', function () use ($app) { 15 return $app['twig']->render('contato.twig') 16 }); 17 18 $app->post('/contato', function (Request $request) use ($app) { 19 $contato = array( 20 'nome' => $request->get('nome'), 21 'email' => $request->get('email'), 22 'assunto' => $request->get('assunto'), 23 'mensagem' => $request->get('mensagem'), 24 ); 25 /* Minha query salvando o contato */ 26 return $app['twig']->render('contato-sucesso.twig') 27 }); 28 29 $app->run(); GET, POST, PUT, DELETE OU MATCH
  34. ROUTE MIDDLEWARES

  35. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 /* ... */ 13 14 $mustBeAnonymous = function (Request $request) use ($app) { 15 if ($app['session']->has('user')) 16 return $app->redirect('/logout'); 17 }; 18 19 $app->get('/signup', function () use ($app) { 20 return $app['twig']->render('signup.twig') 21 }) 22 ->before($mustBeAnonymous); 23 24 $app->run(); BEFORE ROUTE
  36. 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5 6 $app

    = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 /* ... */ 13 14 $app->get('/meu-relatorio', function () use ($app) { 15 return $app['twig']->render('signup.twig') 16 }) 17 ->before(function (Request $request) use ($app) { 18 if (!$app['session']->has('user')) 19 return $app->redirect('/login'); 20 }) 21 ->before(function (Request $request) use ($app) { 22 $app['time.start'] = microtime(true) 23 }) 24 ->after(function (Request $request, Response $response) use ($app) { 25 $duracao = microtime(true) - $app['time.start']; 26 /* Minha função pra gravar em logs */ 27 }); 28 29 $app->run(); AFTER ROUTE
  37. APPLICATION FILTERS

  38. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->before(function (Request $request) use ($app) { 13 // set up 14 $request->getSession()->start(); 15 $app['time.start'] = microtime(true); 16 }); 17 18 $app->after(function (Request $request, Response $response) use ($app) { 19 // tear down 20 $app['time.end'] = microtime(true); 21 }); 22 23 $app->finish(function (Request $request, Response $response) use ($app) { 24 // after response has been sent 25 $duracao = $app['time.end'] - $app['time.start']; 26 /* Minha função pra gravar em logs */ 27 }); 28 29 $app->run(); BEFORE, AFTER, FINISH
  39. ERROR CONTROL

  40. 1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5

    6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 /* ... */ 13 14 $app['debug'] = TRUE; 15 16 $app->error(function (\Exception $e, $code) { 17 /* Tratamento da exception */ 18 }); 19 20 $app->error(function (\LogicException $e, $code) { 21 /* Tratamento da exception */ 22 }); 23 24 $app->run();
  41. DÚVIDAS?

  42. OBRIGADO!