API REST com PHP

Criar e consumir API REST com PHP
Voltar

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.


Pré-requisitos:

  • XAMPP executando
  • Composer: Download
  • Módulo Apache Rewrite (Ver se ativado): Tutorial

Passo a passo:

  • Criar diretórios App/Models, App/Services, public_html/.htaccess, public_html/index.php, composer.json, config.php
  • No diretório do projeto, executar 'composer update', onde os arquivos de configurações serão criados
  • Executar banco de dados, seguindo os dados no config.php
  • Informando, no browser, 'urlProjeto/api/user' listará JSON de todos usuários
  • Informando, no browser, 'urlProjeto/api/user/1' mostrará dados do usuário 1
  • urlProjeto/client.php é alusivo a outra aplicação, que consome a API
Github projeto

Arquivos


banco.sql

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

App/Models/User.php

<?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!");
        }
    }
}
?>

App/Services/UserService.php

<?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() {}
}
?>

public_html/.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

public_html/client.php

<?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>

public_html/index.php

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

composer.json

{
    "autoload": {
        "psr-4": {
            "App\\":"App"
        },
        "files": [
            "config.php"
        ]
    },
    "require": {}
}

config.php

<?php
const DBDRIVE = 'mysql';
const DBHOST = 'localhost';
const DBNAME = 'serie_login';
const DBUSER = 'root';
const DBPASS = '';
?>

Elaborado por Mateus Schwede
ubsocial.github.io