Api usando Silex

37
Criando APIs usando o micro-framework Silex

description

Apresentando o micro-framework Silex

Transcript of Api usando Silex

Page 1: Api usando Silex

Criando APIsusando o micro-framework

Silex

Page 2: Api usando Silex

Elton MinettoGraduado/pós-graduado em Ciência da Computação

Desenvolvedor desde 1997Professor desde 2004

Autor de dois livros sobre PHP

Sócio da CoderockrInstrutor do Code Squad

Page 3: Api usando Silex

API

Page 4: Api usando Silex

O que é?

Page 5: Api usando Silex

"[] 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

Page 6: Api usando Silex

Porque criar uma API?

Page 7: Api usando Silex

Múltiplas interfaces (web, mobile, CLI)

Page 8: Api usando Silex
Page 9: Api usando Silex

Integração com outros serviços da sua empresa

Venda de recursos (Amazon, Parse, Pusher, Filepicker, etc)

Page 10: Api usando Silex

Exemplo

Page 11: Api usando Silex

RestBeer

Page 13: Api usando Silex

Silex

Page 14: Api usando Silex

Micro-framework para PHP 5.3 (e

superiores) construído com base nos componentes do Symfony e inspirado no Sinatra (ruby)

Page 15: Api usando Silex

Instalando

Page 16: Api usando Silex

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

Instalando as dependências

curl -s http://getcomposer.org/installer | phpphp composer.phar install

Page 17: Api usando Silex

Mostrando as cervejas

Page 18: Api usando Silex

<?phpuse 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();

Page 19: Api usando Silex

Testando com o servidor do PHP 5.4

Page 20: Api usando Silex

php -S localhost:8080

Page 21: Api usando Silex

Mostrando uma em específico

Page 22: Api usando Silex

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

Page 23: Api usando Silex

Formatando o resultado

Page 24: Api usando Silex

//Adicionar os novos namespaces no começo do arquivouse 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');});

Page 25: Api usando Silex

Autenticando

Page 26: Api usando Silex

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

Page 27: Api usando Silex

Adicionando uma Cerveja

Page 28: Api usando Silex

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

Page 29: Api usando Silex

Alterando uma Cerveja

Page 30: Api usando Silex

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

Page 31: Api usando Silex

Excluindo uma Cerveja

Page 32: Api usando Silex

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

Page 33: Api usando Silex

Referências

Page 34: Api usando Silex

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

https://github.com/eminetto/restbeer

Page 36: Api usando Silex

Contato