$30 off During Our Annual Pro Sale. View Details »

Api usando Silex.pdf

Elton Minetto
November 01, 2012
1.4k

Api usando Silex.pdf

Elton Minetto

November 01, 2012
Tweet

Transcript

  1. Criando
    APIs
    usando o micro-framework
    Silex

    View Slide

  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

    View Slide

  3. API

    View Slide

  4. O que é?

    View Slide

  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

    View Slide

  6. Porque criar uma
    API?

    View Slide

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

    View Slide

  8. View Slide

  9. Integração com outros serviços da sua
    empresa
    Venda de recursos (Amazon, Parse, Pusher,
    Filepicker, etc)

    View Slide

  10. Exemplo

    View Slide

  11. RestBeer

    View Slide

  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

    View Slide

  13. Silex

    View Slide

  14. Micro-framework para PHP 5.3 (e
    superiores) construído com base nos
    componentes do Symfony e inspirado no
    Sinatra (ruby)

    View Slide

  15. Instalando

    View Slide

  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

    View Slide

  17. Mostrando as
    cervejas

    View Slide

  18. 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();

    View Slide

  19. Testando com o
    servidor do PHP 5.4

    View Slide

  20. php -S localhost:8080

    View Slide

  21. Mostrando uma em
    específico

    View Slide

  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);

    View Slide

  23. Formatando o
    resultado

    View Slide

  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');
    });

    View Slide

  25. Autenticando

    View Slide

  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);
    }
    });

    View Slide

  27. Adicionando uma
    Cerveja

    View Slide

  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);
    });

    View Slide

  29. Alterando uma
    Cerveja

    View Slide

  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);
    });

    View Slide

  31. Excluindo uma
    Cerveja

    View Slide

  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);
    });

    View Slide

  33. Referências

    View Slide

  34. Exemplo completo
    (com integração com o Docrine e usando SQLite)
    https://github.com/eminetto/restbeer

    View Slide

  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

    View Slide

  36. Contato

    View Slide

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

    View Slide