Criação e consumo de API REST com PHP, padrão PSR-4. O exemplo foi desenvolvido sem utilização de routes e o conceito de services, ao invés de controller (Somente nomeclatura difrente). Mais informações sobre conceitos teóricos, no post API REST com Laravel.
CREATE DATABASE serie_login;
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) NOT NULL,
password VARCHAR(50) NOT NULL,
name VARCHAR(50) NOT NULL
);
INSERT INTO user(email,password,name) VALUES ("ubsocial@gmail","123","ubsocial"),("ubsocial@outlook","456","ubsocial2");
<?php
namespace App\Models;
class User {
public static function select(int $id) {
$db = new \PDO(DBDRIVE.': host='.DBHOST.'; dbname='.DBNAME, DBUSER, DBPASS);
$r = $db->prepare("SELECT * FROM user WHERE id=?");
$r->execute(array($id));
if ($r->rowCount()>0) {
return $r->fetchAll(\PDO::FETCH_ASSOC);
} else {
throw new \Exception("Nenhum usuário encontrado!");
}
}
public static function selectAll() {
$db = new \PDO(DBDRIVE.': host='.DBHOST.'; dbname='.DBNAME, DBUSER, DBPASS);
$r = $db->query("SELECT * FROM user");
if ($r->rowCount()>0) {
return $r->fetchAll(\PDO::FETCH_ASSOC);
} else {
throw new \Exception("Nenhum usuário encontrado!");
}
}
public static function insert($data) {
$db = new \PDO(DBDRIVE.': host='.DBHOST.'; dbname='.DBNAME, DBUSER, DBPASS);
$r = $db->prepare("INSERT INTO user (email,password,name) VALUES (?,?,?)");
$r->execute(array($data['email'],$data['password'],$data['name']));
if ($r->rowCount()>0) {
return "Usuário inserido!";
} else {
throw new \Exception("Falha ao inserir usuário!");
}
}
}
?>
<?php
namespace App\Services;
use App\Models\User;
class UserService {
//Ver dados de usuário
public function get($id = null) {
if ($id) {
return User::select($id);
} else {
return User::selectAll();
}
}
//Inserir dados de usuário
public function post() {
return User::insert($_POST);
}
//Editar dados de usuário
public function update() {}
//Excluir dados de usuário
public function delete() {}
}
?>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
<?php
$url = 'http://localhost/projetos/api_rest_php/public_html/api'; //Edite conforme diretório do projeto
$class = '/user';
$param = ''; //Pode ser o parâmetro específico, como 1 no final da URL (/1) para dados do user id 1
$response = file_get_contents($url.$class.$param);
$response = json_decode($response,1); //Opção 1 transforma em array, sem opção mantém como objeto
//var_dump($response); //Mostra array JSON com todos dados
var_dump($response['data'][1]['email']); //Mostra email do usuário index 1
?>
<h3>Adicionar Usuário:</h3>
<form action="<?=$url.$class?>" method="post">
<input type="text" required name="name" placeholder="Nome">
<input type="email" required name="email" placeholder="email@email.com">
<input type="text" required name="password" placeholder="Senha">
<input type="submit" value="Adicionar">
</form>
<?php
header('Content-Type: application/json');
require_once '../vendor/autoload.php';
if ($_GET['url']) {
$url = explode('/', $_GET['url']);
if ($url[0] === 'api') {
array_shift($url);
$service = 'App\Services\\'.ucfirst($url[0]).'Service';
array_shift($url);
$method = strtolower($_SERVER['REQUEST_METHOD']);
try {
$response = call_user_func_array(array(new $service, $method), $url);
http_response_code(200); //Código de sucesso
echo json_encode(array('status'=>'sucess', 'data'=>$response));
exit;
} catch (\Exception $e) {
http_response_code(404); //Código de não encontrado
echo json_encode(array('status'=>'error', 'data'=>$e->getMessage()), JSON_UNESCAPED_UNICODE);
exit;
}
}
}
?>
{
"autoload": {
"psr-4": {
"App\\":"App"
},
"files": [
"config.php"
]
},
"require": {}
}
<?php
const DBDRIVE = 'mysql';
const DBHOST = 'localhost';
const DBNAME = 'serie_login';
const DBUSER = 'root';
const DBPASS = '';
?>
Elaborado por Mateus Schwede
ubsocial.github.io