SlideShare uma empresa Scribd logo
1 de 46
Baixar para ler offline
Criando APIs
usando o micro-framework
Respect
Ivan Rosolen
Graduado em sistemas de Informção
Pós-graduado em Gerência de Projetos
Desenvolvedor a 10+ anos
Autor de vários PHPT (testes para o PHP)
Gerente de Projetos na Arizona
API
O que é?
"[] 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
Porque criar uma
API?
Múltiplas interfaces (web, mobile, CLI)
Integração com outros serviços da
sua empresa
Venda de recursos e dados
EXEMPLO
RestBeer
API de informações de Ceveja!
http://restbeer.local/cervejas/
http://restbeer.local/cervejas/Guinness
http://restbeer.local/cervejas/Heineken
http://restbeer.local/cervejas/Skol
RESPECT
Micro-framework para PHP 5.3+
construido por Alexandre Gaigalas
(alganet) e comunidade
Instalando
vhost (apache)
ServerName "restbeer.local"
DocumentRoot "/caminho_do_projeto/restBeer/"
<Directory "/caminho_do_projeto/restBeer">
Options -Indexes FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow from all
</Directory>
CustomLog /caminho_dos_logs/restbeer-access_log combined
ErrorLog /caminho_dos_logs/restbeer-error_log
/etc/hosts
127.0.0.1 restbeer.local
.htaccess
RewriteEngine On
# Redirect all requests not pointing at an actual file to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
composer.json
{
"name": "RestBeer",
"authors": [
{
"name": "Ivan Rosolen",
"email": "ivan@rosolen.net"
}
],
"require": {
"respect/rest": "0.5.x",
"respect/relational": "0.5.x",
"respect/config": "0.3.x",
"respect/validation": "0.4.x"
}
}
Instalando dependências
curl -s http://getcomposer.org/installer | php
php composer.phar install
Respect/Config
‣ Apenas arquivos .INI
‣ Usa o mesmo parser nativo e rápido do php.ini
‣ Extende o arquivo .INI com seu próprio “dialeto”
‣ Implementa lazy loading para instancias de objeto
‣ Arquivo config.ini:
db_name = "restbeer.db"
dsn = "sqlite:[db_name]"
‣ Utilização:
use RespectConfigContainer;
/**
* Ler arquivo de configuração
*/
$config = new Container('config.ini');
echo $config->dsn; // sqlite:restbeer.db
‣ http://github.com/Respect/Config
Respect/Relational
‣ Quase zero de configuracão
‣ Fluent interface: $mapper->author[7]->fetch();
‣ Se adapta a diferentes databases
‣ Registros são tratados como Plain Data Object
‣ Dependência: RespectData (http://github.com/Respect/Data)
‣ Utilização:
use RespectRelationalMapper;
// Criar instância PDO com o SQLite
// diretório precisa ter permissão de escrita também o.O
$mapper = new Mapper(new PDO('sqlite:database.sq3'));
// buscar todos os autores
$authors = $mapper->author->fetchAll();
// gravar um autor
$obj = new stdClass;
$obj->name = 'Ivan Rosolen';
$mapper->author->persist($obj);
$mapper->flush();
‣ http://github.com/Respect/Relational
Respect/Validation
‣ Fluent/Chained interface: v::numeric()->positive()->between(1, 256)->validate($num)
‣ Mais de 30 validadores testados
‣ Possibilidade de utilizar validadores Zend/Symfony se instalados
‣ Utilização:
use RespectValidationValidator as v;
// validar número simples
$number = 123;
v::numeric()->validate($number); //true
// validar em cadeia
$v = v::arr() // validar se é array
->key('nome', $rule = v::alnum()->notEmpty()->noWhitespace()) // validar a key 'nome'
->key('estilo', $rule) // utilizando a mesma regra da key de cima
->validate($_POST['cerveja']);
// zend validator
$hostnameValidator = v::zend('Hostname')->assert('google.com');
// symfony validator
$timeValidator = v::sf('Time')->assert('22:00:01');
‣ https://github.com/Respect/Validation
Respect/Router
‣ Thin and lightweight controller para aplicações RESTful e APIs
‣ Curva de aprendizado pequena
‣ Ótima documentação em português: http://www.cssexperts.net/respect-rest-docs-br/
‣ Utilização:
use RespectRestRouter;
// Criar instância do router
$router = new Router; // raiz http://example.com/
// instância para trabalhar em uma subpasta
$router = new Router('/pasta'); // raiz http://example.com/pasta
// Olá mundo
$router->get('/', function() {
	 return 'Hello World';
});
‣ https://github.com/Respect/Rest
Começando o
projeto
// autoload do composer
require 'vendor/autoload.php';
use RespectRestRouter;
use RespectConfigContainer;
use RespectValidationValidator as v;
use RespectRelationalMapper;
use RespectDataCollectionsCollection;
/**
* Ler arquivo de configuração
*/
$config = new Container('config.ini');
/**
* Criar instância PDO com o SQLite usando as configs
*/
// diretório precisa ter permissão de escrita também
$mapper = new Mapper(new PDO($config->dsn));
// Criar instância do router
$router = new Router();
/**
* Rota para qualquer tipo de request (any)
*/
$router->any('/', function () {
return 'RestBeer!';
});
Buscar cervejas
$router->get('/cervejas/*', function ($nome) use ($mapper) {
if ( !isset($nome) ) {
$cervejas = $mapper->cervejas->fetchAll();
header('HTTP/1.1 200 Ok');
return $cervejas;
}
$nome = filter_var( $nome, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
if ( v::not(v::alnum()->notEmpty())->validate($nome) ) {
header('HTTP/1.1 404 Not Found');
return 'Não encontrada';
}
$cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch();
// BONUS - podemos buscar por id também
// $cerveja = $mapper->cervejas[$id]->fetch();
if ( !$cerveja ) {
header('HTTP/1.1 404 Not Found');
return 'Não encontrada';
}
header('HTTP/1.1 200 Ok');
return $cerveja;
});
Cadastrar uma
cerveja
$router->post('/cervejas', function () use ($mapper,$cervejas) {
if ( !isset($_POST) || !isset($_POST['cerveja']) || v::not(v::arr())->validate($_POST['cerveja']) ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$validation = v::arr()
->key('nome', $rule = v::alnum()->notEmpty()->noWhitespace())
->key('estilo', $rule)
->validate($_POST['cerveja']);
if ( !$validation ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$cerveja = new stdClass();
$cerveja->nome = filter_var($_POST['cerveja']['nome'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$cerveja->estilo = filter_var($_POST['cerveja']['estilo'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$check = $mapper->cervejas(array( 'nome' => $cerveja->nome ))->fetch();
if ( $check ) {
header('HTTP/1.1 409 Conflict');
return 'Cerveja já existe no sistema';
}
$mapper->cervejas->persist($cerveja);
$mapper->flush();
if ( !isset($cerveja->id) || empty($cerveja->id) ) {
header('HTTP/1.1 500 Internal Server Error');
return 'Erro ao inserir cerveja';
}
header('HTTP/1.1 201 Created');
return 'Cerveja criada';
});
Alterar uma
cerveja
$router->put('/cervejas/*', function ($nome) use ($mapper) {
parse_str(file_get_contents('php://input'), $data);
if ( !isset($data) || !isset($data['cerveja']) || v::not(v::arr())->validate($data['cerveja']) ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$validation = v::arr()->key('nome',$rule = v::alnum()->notEmpty()->noWhitespace())
->key('estilo', $rule)
->validate($data['cerveja']);
if ( !$validation ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch();
if ( !$cerveja ) {
header('HTTP/1.1 404 Not Found');
return 'Não encontrada';
}
$newNome = filter_var( $data['cerveja']['nome'], FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$newEstilo = filter_var( $data['cerveja']['estilo'], FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$cerveja->nome = $newNome;
$cerveja->estilo = $newEstilo;
$mapper->cervejas->persist($cerveja);
$mapper->flush();
header('HTTP/1.1 200 Ok');
return 'Cerveja atualizada';
});
// removidas algumas verificações para ficar melhor no slide (http://github.com/ivanrosolen/RestBeer)
Remover uma
cerveja
$router->delete('/cervejas/*', function ($nome) use ($mapper) {
$nome = filter_var( $nome, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
if ( !isset($nome) || v::not(v::alnum()->notEmpty())->validate($nome) ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch();
if ( !$cerveja ) {
header('HTTP/1.1 404 Not Found');
return 'Não encontrada';
}
$mapper->cervejas->remove($cerveja);
$mapper->flush();
header('HTTP/1.1 200 Ok');
return 'Cerveja removida';
});
Formatar
Resultado
$jsonRender = function ($data) {
header('Content-Type: application/json');
if ( v::string()->validate($data) ) {
$data = array($data);
}
return json_encode($data,true);
};
$router->always('Accept', array('application/json' => $jsonRender));
Autenticação
básica
// do not use this!
function checkLogin($user, $pass) {
return $user === 'admin' && $pass === 'admin';
}
$router->get('/admin', function () {
return 'RestBeer Admin Protected!';
})->authBasic('Secret Area', function ($user, $pass) {
return checkLogin($user, $pass);
});
REFERÊNCIAS
Source
https://github.com/ivanrosolen/RestBeer
https://github.com/Respect/
http://respect.li/
(docs inglês)
http://www.cssexperts.net/respect-rest-docs-br/
(docs e exemplos do rest pt-br)
http://www.slideshare.net/Alganet/rest-faa-o-servio-direito
CONTATO
@ivanrosolen
http://ivanrosolen.com
contato@ivanrosolen.com

Mais conteúdo relacionado

Mais procurados

LabMM4 (T16 - 12/13) - PHP + MySQL
LabMM4 (T16 - 12/13) - PHP + MySQLLabMM4 (T16 - 12/13) - PHP + MySQL
LabMM4 (T16 - 12/13) - PHP + MySQL
Carlos Santos
 
Aula 12 Relatório - Tabelas
Aula 12   Relatório - TabelasAula 12   Relatório - Tabelas
Aula 12 Relatório - Tabelas
Dalton Martins
 

Mais procurados (20)

PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
 
PHP 7
PHP 7PHP 7
PHP 7
 
Apresentacao TCC - Rafael Felix
Apresentacao TCC - Rafael FelixApresentacao TCC - Rafael Felix
Apresentacao TCC - Rafael Felix
 
Minicurso de jQuery
Minicurso de jQueryMinicurso de jQuery
Minicurso de jQuery
 
LabMM4 (T16 - 12/13) - PHP + MySQL
LabMM4 (T16 - 12/13) - PHP + MySQLLabMM4 (T16 - 12/13) - PHP + MySQL
LabMM4 (T16 - 12/13) - PHP + MySQL
 
Aula 12 Relatório - Tabelas
Aula 12   Relatório - TabelasAula 12   Relatório - Tabelas
Aula 12 Relatório - Tabelas
 
Da Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualDa Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtual
 
Java script aula 08 - formulários
Java script   aula 08 - formuláriosJava script   aula 08 - formulários
Java script aula 08 - formulários
 
Nossa experiência com TDD
Nossa experiência com TDDNossa experiência com TDD
Nossa experiência com TDD
 
Introdução à JQuery
Introdução à JQueryIntrodução à JQuery
Introdução à JQuery
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicação
 
Design patterns
Design patternsDesign patterns
Design patterns
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend Framework
 
Minicurso Testando RESTful Web Services
Minicurso Testando RESTful Web ServicesMinicurso Testando RESTful Web Services
Minicurso Testando RESTful Web Services
 
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
 
Java script - funções
Java script - funçõesJava script - funções
Java script - funções
 
PHP MySQL Aula 03
PHP MySQL Aula 03PHP MySQL Aula 03
PHP MySQL Aula 03
 

Destaque

Destaque (8)

Php e Cassandra
Php e Cassandra Php e Cassandra
Php e Cassandra
 
PHPT
PHPTPHPT
PHPT
 
CakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápidoCakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápido
 
TestFest - Respect\Validation 1.0
TestFest - Respect\Validation 1.0TestFest - Respect\Validation 1.0
TestFest - Respect\Validation 1.0
 
Using RESTFUL APIs in ANGULARJS
Using RESTFUL APIs in ANGULARJSUsing RESTFUL APIs in ANGULARJS
Using RESTFUL APIs in ANGULARJS
 
Sistemas Distribuídos e PHP - Darkmira Tour BR 2016
Sistemas Distribuídos e PHP - Darkmira Tour BR 2016Sistemas Distribuídos e PHP - Darkmira Tour BR 2016
Sistemas Distribuídos e PHP - Darkmira Tour BR 2016
 
Espírito de Comunidade
Espírito de ComunidadeEspírito de Comunidade
Espírito de Comunidade
 
Introdução ao Deep Learning com o TensorFlow
Introdução ao Deep Learning com o TensorFlowIntrodução ao Deep Learning com o TensorFlow
Introdução ao Deep Learning com o TensorFlow
 

Semelhante a Criando APIs usando o micro-framework Respect

Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
Regis Magalhães
 
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e JavascriptCriando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Ivan Paulovich
 
Conhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web APIConhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web API
Ivan Paulovich
 
Aula 08 - Introdução ao banco de dados MySQL - Programação Web
Aula 08 - Introdução ao banco de dados MySQL - Programação WebAula 08 - Introdução ao banco de dados MySQL - Programação Web
Aula 08 - Introdução ao banco de dados MySQL - Programação Web
Dalton Martins
 
Validação e Operações CRUD em PHP
Validação e Operações CRUD em PHPValidação e Operações CRUD em PHP
Validação e Operações CRUD em PHP
Breno Vitorino
 

Semelhante a Criando APIs usando o micro-framework Respect (20)

Api usando Silex
Api usando SilexApi usando Silex
Api usando Silex
 
Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
Criando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHPCriando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHP
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php seguros
 
PHP MySQL Aula 07
PHP MySQL Aula 07PHP MySQL Aula 07
PHP MySQL Aula 07
 
Bread board
Bread boardBread board
Bread board
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Php 02 Primeiros Passos
Php 02 Primeiros PassosPhp 02 Primeiros Passos
Php 02 Primeiros Passos
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e JavascriptCriando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
Conhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web APIConhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web API
 
Yet Another Ruby Framework - Como o Rails funciona por dentro
Yet Another Ruby Framework - Como o Rails funciona por dentroYet Another Ruby Framework - Como o Rails funciona por dentro
Yet Another Ruby Framework - Como o Rails funciona por dentro
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
Aula 08 - Introdução ao banco de dados MySQL - Programação Web
Aula 08 - Introdução ao banco de dados MySQL - Programação WebAula 08 - Introdução ao banco de dados MySQL - Programação Web
Aula 08 - Introdução ao banco de dados MySQL - Programação Web
 
Treinamento ajax 03
Treinamento ajax   03Treinamento ajax   03
Treinamento ajax 03
 
Validação e Operações CRUD em PHP
Validação e Operações CRUD em PHPValidação e Operações CRUD em PHP
Validação e Operações CRUD em PHP
 
ZF Básico - 6. Autenticação
ZF Básico - 6. AutenticaçãoZF Básico - 6. Autenticação
ZF Básico - 6. Autenticação
 

Mais de Ivan Rosolen

Mais de Ivan Rosolen (14)

15 mandamentos de um bom programador
15 mandamentos de um bom programador15 mandamentos de um bom programador
15 mandamentos de um bom programador
 
Utilizando Filas com PHP
Utilizando Filas com PHPUtilizando Filas com PHP
Utilizando Filas com PHP
 
Filas com php
Filas com phpFilas com php
Filas com php
 
Boas Práticas com PHP
Boas Práticas com PHPBoas Práticas com PHP
Boas Práticas com PHP
 
Mercado de Tecnologia
Mercado de TecnologiaMercado de Tecnologia
Mercado de Tecnologia
 
Deploy automatizado de Aplicações no Jelastic
Deploy automatizado de Aplicações no JelasticDeploy automatizado de Aplicações no Jelastic
Deploy automatizado de Aplicações no Jelastic
 
Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)
 
JSON Web Tokens
JSON Web TokensJSON Web Tokens
JSON Web Tokens
 
Tecnologias e Inovação
Tecnologias e InovaçãoTecnologias e Inovação
Tecnologias e Inovação
 
Jelastic
JelasticJelastic
Jelastic
 
Aws video creator
Aws video creatorAws video creator
Aws video creator
 
Cassandra 7 masters
Cassandra 7 mastersCassandra 7 masters
Cassandra 7 masters
 
Quando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucessoQuando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucesso
 
Case: PHP como Base de Digital Asset Management – arizona.flow
Case: PHP como Base de Digital Asset Management – arizona.flowCase: PHP como Base de Digital Asset Management – arizona.flow
Case: PHP como Base de Digital Asset Management – arizona.flow
 

Criando APIs usando o micro-framework Respect

  • 1. Criando APIs usando o micro-framework Respect
  • 2. Ivan Rosolen Graduado em sistemas de Informção Pós-graduado em Gerência de Projetos Desenvolvedor a 10+ anos Autor de vários PHPT (testes para o PHP) Gerente de Projetos na Arizona
  • 3. API
  • 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
  • 8. Integração com outros serviços da sua empresa Venda de recursos e dados
  • 11. API de informações de Ceveja! http://restbeer.local/cervejas/ http://restbeer.local/cervejas/Guinness http://restbeer.local/cervejas/Heineken http://restbeer.local/cervejas/Skol
  • 13. Micro-framework para PHP 5.3+ construido por Alexandre Gaigalas (alganet) e comunidade
  • 15. vhost (apache) ServerName "restbeer.local" DocumentRoot "/caminho_do_projeto/restBeer/" <Directory "/caminho_do_projeto/restBeer"> Options -Indexes FollowSymLinks AllowOverride All Order Allow,Deny Allow from all </Directory> CustomLog /caminho_dos_logs/restbeer-access_log combined ErrorLog /caminho_dos_logs/restbeer-error_log
  • 17. .htaccess RewriteEngine On # Redirect all requests not pointing at an actual file to index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . index.php [L]
  • 18. composer.json { "name": "RestBeer", "authors": [ { "name": "Ivan Rosolen", "email": "ivan@rosolen.net" } ], "require": { "respect/rest": "0.5.x", "respect/relational": "0.5.x", "respect/config": "0.3.x", "respect/validation": "0.4.x" } }
  • 19. Instalando dependências curl -s http://getcomposer.org/installer | php php composer.phar install
  • 21. ‣ Apenas arquivos .INI ‣ Usa o mesmo parser nativo e rápido do php.ini ‣ Extende o arquivo .INI com seu próprio “dialeto” ‣ Implementa lazy loading para instancias de objeto ‣ Arquivo config.ini: db_name = "restbeer.db" dsn = "sqlite:[db_name]" ‣ Utilização: use RespectConfigContainer; /** * Ler arquivo de configuração */ $config = new Container('config.ini'); echo $config->dsn; // sqlite:restbeer.db ‣ http://github.com/Respect/Config
  • 23. ‣ Quase zero de configuracão ‣ Fluent interface: $mapper->author[7]->fetch(); ‣ Se adapta a diferentes databases ‣ Registros são tratados como Plain Data Object ‣ Dependência: RespectData (http://github.com/Respect/Data) ‣ Utilização: use RespectRelationalMapper; // Criar instância PDO com o SQLite // diretório precisa ter permissão de escrita também o.O $mapper = new Mapper(new PDO('sqlite:database.sq3')); // buscar todos os autores $authors = $mapper->author->fetchAll(); // gravar um autor $obj = new stdClass; $obj->name = 'Ivan Rosolen'; $mapper->author->persist($obj); $mapper->flush(); ‣ http://github.com/Respect/Relational
  • 25. ‣ Fluent/Chained interface: v::numeric()->positive()->between(1, 256)->validate($num) ‣ Mais de 30 validadores testados ‣ Possibilidade de utilizar validadores Zend/Symfony se instalados ‣ Utilização: use RespectValidationValidator as v; // validar número simples $number = 123; v::numeric()->validate($number); //true // validar em cadeia $v = v::arr() // validar se é array ->key('nome', $rule = v::alnum()->notEmpty()->noWhitespace()) // validar a key 'nome' ->key('estilo', $rule) // utilizando a mesma regra da key de cima ->validate($_POST['cerveja']); // zend validator $hostnameValidator = v::zend('Hostname')->assert('google.com'); // symfony validator $timeValidator = v::sf('Time')->assert('22:00:01'); ‣ https://github.com/Respect/Validation
  • 27. ‣ Thin and lightweight controller para aplicações RESTful e APIs ‣ Curva de aprendizado pequena ‣ Ótima documentação em português: http://www.cssexperts.net/respect-rest-docs-br/ ‣ Utilização: use RespectRestRouter; // Criar instância do router $router = new Router; // raiz http://example.com/ // instância para trabalhar em uma subpasta $router = new Router('/pasta'); // raiz http://example.com/pasta // Olá mundo $router->get('/', function() { return 'Hello World'; }); ‣ https://github.com/Respect/Rest
  • 29. // autoload do composer require 'vendor/autoload.php'; use RespectRestRouter; use RespectConfigContainer; use RespectValidationValidator as v; use RespectRelationalMapper; use RespectDataCollectionsCollection; /** * Ler arquivo de configuração */ $config = new Container('config.ini'); /** * Criar instância PDO com o SQLite usando as configs */ // diretório precisa ter permissão de escrita também $mapper = new Mapper(new PDO($config->dsn)); // Criar instância do router $router = new Router(); /** * Rota para qualquer tipo de request (any) */ $router->any('/', function () { return 'RestBeer!'; });
  • 31. $router->get('/cervejas/*', function ($nome) use ($mapper) { if ( !isset($nome) ) { $cervejas = $mapper->cervejas->fetchAll(); header('HTTP/1.1 200 Ok'); return $cervejas; } $nome = filter_var( $nome, FILTER_SANITIZE_FULL_SPECIAL_CHARS ); if ( v::not(v::alnum()->notEmpty())->validate($nome) ) { header('HTTP/1.1 404 Not Found'); return 'Não encontrada'; } $cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch(); // BONUS - podemos buscar por id também // $cerveja = $mapper->cervejas[$id]->fetch(); if ( !$cerveja ) { header('HTTP/1.1 404 Not Found'); return 'Não encontrada'; } header('HTTP/1.1 200 Ok'); return $cerveja; });
  • 33. $router->post('/cervejas', function () use ($mapper,$cervejas) { if ( !isset($_POST) || !isset($_POST['cerveja']) || v::not(v::arr())->validate($_POST['cerveja']) ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $validation = v::arr() ->key('nome', $rule = v::alnum()->notEmpty()->noWhitespace()) ->key('estilo', $rule) ->validate($_POST['cerveja']); if ( !$validation ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $cerveja = new stdClass(); $cerveja->nome = filter_var($_POST['cerveja']['nome'], FILTER_SANITIZE_FULL_SPECIAL_CHARS); $cerveja->estilo = filter_var($_POST['cerveja']['estilo'], FILTER_SANITIZE_FULL_SPECIAL_CHARS); $check = $mapper->cervejas(array( 'nome' => $cerveja->nome ))->fetch(); if ( $check ) { header('HTTP/1.1 409 Conflict'); return 'Cerveja já existe no sistema'; } $mapper->cervejas->persist($cerveja); $mapper->flush(); if ( !isset($cerveja->id) || empty($cerveja->id) ) { header('HTTP/1.1 500 Internal Server Error'); return 'Erro ao inserir cerveja'; } header('HTTP/1.1 201 Created'); return 'Cerveja criada'; });
  • 35. $router->put('/cervejas/*', function ($nome) use ($mapper) { parse_str(file_get_contents('php://input'), $data); if ( !isset($data) || !isset($data['cerveja']) || v::not(v::arr())->validate($data['cerveja']) ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $validation = v::arr()->key('nome',$rule = v::alnum()->notEmpty()->noWhitespace()) ->key('estilo', $rule) ->validate($data['cerveja']); if ( !$validation ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch(); if ( !$cerveja ) { header('HTTP/1.1 404 Not Found'); return 'Não encontrada'; } $newNome = filter_var( $data['cerveja']['nome'], FILTER_SANITIZE_FULL_SPECIAL_CHARS ); $newEstilo = filter_var( $data['cerveja']['estilo'], FILTER_SANITIZE_FULL_SPECIAL_CHARS ); $cerveja->nome = $newNome; $cerveja->estilo = $newEstilo; $mapper->cervejas->persist($cerveja); $mapper->flush(); header('HTTP/1.1 200 Ok'); return 'Cerveja atualizada'; }); // removidas algumas verificações para ficar melhor no slide (http://github.com/ivanrosolen/RestBeer)
  • 37. $router->delete('/cervejas/*', function ($nome) use ($mapper) { $nome = filter_var( $nome, FILTER_SANITIZE_FULL_SPECIAL_CHARS ); if ( !isset($nome) || v::not(v::alnum()->notEmpty())->validate($nome) ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch(); if ( !$cerveja ) { header('HTTP/1.1 404 Not Found'); return 'Não encontrada'; } $mapper->cervejas->remove($cerveja); $mapper->flush(); header('HTTP/1.1 200 Ok'); return 'Cerveja removida'; });
  • 39. $jsonRender = function ($data) { header('Content-Type: application/json'); if ( v::string()->validate($data) ) { $data = array($data); } return json_encode($data,true); }; $router->always('Accept', array('application/json' => $jsonRender));
  • 41. // do not use this! function checkLogin($user, $pass) { return $user === 'admin' && $pass === 'admin'; } $router->get('/admin', function () { return 'RestBeer Admin Protected!'; })->authBasic('Secret Area', function ($user, $pass) { return checkLogin($user, $pass); });
  • 44. https://github.com/Respect/ http://respect.li/ (docs inglês) http://www.cssexperts.net/respect-rest-docs-br/ (docs e exemplos do rest pt-br) http://www.slideshare.net/Alganet/rest-faa-o-servio-direito