Api usando Silex.pdf

0227f6274b8a6cce078d7f8a91460c41?s=47 Elton Minetto
November 01, 2012
1.3k

Api usando Silex.pdf

0227f6274b8a6cce078d7f8a91460c41?s=128

Elton Minetto

November 01, 2012
Tweet

Transcript

  1. Criando APIs usando o micro-framework Silex

  2. Elton Minetto Graduado/pós-graduado em Ciência da Computação Desenvolvedor desde 1997

    Professor desde 2004 Autor de dois livros sobre PHP Sócio da Coderockr Instrutor do Code Squad
  3. API

  4. O que é?

  5. "[] conjunto de rotinas e padrões estabelecidos por um software

    para a utilização das suas funcionalidades por aplicativos que não pretendem envolver-se em detalhes da implementação do software, mas apenas usar seus serviços []" Wikipedia
  6. Porque criar uma API?

  7. Múltiplas interfaces (web, mobile, CLI)

  8. None
  9. Integração com outros serviços da sua empresa Venda de recursos

    (Amazon, Parse, Pusher, Filepicker, etc)
  10. Exemplo

  11. RestBeer

  12. API de informações sobre cerveja http://restbeer.com/cervejas/ http://restbeer.com/estilos/ http://restbeer.com/cervejas/Guinness http://restbeer.com/cervejas/Heineken http://restbeer.com/estilos/Pilsen

    http://restbeer.com/estilos/Stout
  13. Silex

  14. Micro-framework para PHP 5.3 (e superiores) construído com base nos

    componentes do Symfony e inspirado no Sinatra (ruby)
  15. Instalando

  16. Criando o composer.json { "require": { "silex/silex": "1.0.*" }, "minimum-stability":

    "dev" } Instalando as dependências curl -s http://getcomposer.org/installer | php php composer.phar install
  17. Mostrando as cervejas

  18. <?php use Silex\Application; //loader do Composer $loader = require_once __DIR__.'/vendor/autoload.php';

    $app = new Application(); $cervejas = array( 'marcas' => array('Heineken', 'Guinness', 'Skol', 'Colorado'), 'estilos' => array('Pilsen' , 'Stout') ); $app->get('/cervejas', function () use ($cervejas) { return implode(',', $cervejas['marcas']); }); $app->get('/estilos', function () use ($cervejas) { return implode(',', $cervejas['estilos']); }); $app->run();
  19. Testando com o servidor do PHP 5.4

  20. php -S localhost:8080

  21. Mostrando uma em específico

  22. $app->get('/cervejas/{id}', function ($id) use ($cervejas) { if ($id == null)

    { return implode(',', $cervejas['marcas']); } $key = array_search($id, $cervejas['marcas']); if ($key === null) { return 'Não encontrada'; } return $cervejas['marcas'][$key]; })->value('id', null);
  23. Formatando o resultado

  24. //Adicionar os novos namespaces no começo do arquivo use Symfony\Component\HttpFoundation\Response;

    use Symfony\Component\HttpFoundation\Request; ... //alterar o /cervejas $app->get('/cervejas/{id}', function ($id) use ($cervejas) { if ($id == null) { $result = implode(',', $cervejas['marcas']); return new Response (json_encode($result), 200); } $key = array_search($id, $cervejas['marcas']); if ($key === null) { return new Response (json_encode('Não encontrada'), 404); } return new Response (json_encode($cervejas['marcas'][$key]), 200); })->value('id', null); //adiciona o cabeçalho após todas as requisições $app->after(function (Request $request, Response $response) { $response->headers->set('Content-Type', 'text/json'); });
  25. Autenticando

  26. $app->before(function (Request $request) use ($app) { if( ! $request->headers->has('authorization')){ return

    new Response('Unauthorized', 401); } require_once 'configs/clients.php'; if (!in_array($request->headers->get('authorization'), array_keys($clients))) { return new Response('Unauthorized', 401); } });
  27. Adicionando uma Cerveja

  28. $app->post('/cervejas', function (Request $request) use ($app) { //pega os dados

    if (!$data = $request->get('cerveja')) { return new Response('Faltam parâmetros', 400); } //Persiste na base de dados (considerando uma entidade do Doctrine nesse exemplo) $cerveja = new Cerveja(); $cerveja->nome = $data['nome']; $cerveja->estilo = $data['estilo']; $cerveja->save(); //redireciona para a nova cerveja return $app->redirect('/cervejas/' . $data['nome'], 201); });
  29. Alterando uma Cerveja

  30. $app->put('/cervejas/{id}', function (Request $request, $id) use ($app) { //pega os

    dados if (!$data = $request->get('cerveja')) { return new Response('Faltam parâmetros', 400); } //busca da base de dados if (!$cerveja = $app['db']->find($id)) { return new Response('Não encontrada', 404); } //Persiste na base de dados $cerveja->nome = $data['nome']; $cerveja->estilo = $data['estilo']; $cerveja->save(); return new Response('Cerveja atualizada', 200); });
  31. Excluindo uma Cerveja

  32. $app->delete('/cervejas/{id}', function (Request $request, $id) use ($app) { //busca da

    base de dados if (!$cerveja = $app['db']->find($id)) { return new Response('Não encontrada', 404); } $cerveja->delete(); return new Response('Cerveja removida', 200); });
  33. Referências

  34. Exemplo completo (com integração com o Docrine e usando SQLite)

    https://github.com/eminetto/restbeer
  35. http://www.slideshare.net/hhamon/silex-meets-soap- rest http://www.slideshare.net/Alganet/rest-faa-o-servio- direito http://silex.sensiolabs.org https://github.com/eminetto/silex-sample https://github.com/Coderockr/SOA-Server https://github.com/Coderockr/SOA-Client

  36. Contato

  37. @eminetto http://www.eltonminetto.net http://coderockr.com http://code-squad.com