API RESTful PHP com Laravel

Laravel

É um framework PHP com sintaxe elegante e expressiva, como os desenvolvedores definem. Ele usa arquitetura MVC deixando o código limpo e ajuda a desenvolver aplicações seguras e robustas de forma ágil e eficiente. Laravel conta com uma documentação vasta, o que torna o uso fácil e o conteúdo acessível.

A grande vantagem é sem dúvida a agilidade, pois podemos criar rotas, controles e vistas (views) com pouquíssimo código. E se, como no caso deste post, você pretende apenas criar uma API RESTful a coisa se torna mais rápida ainda.

Nossa API

Faremos uma API simples para cadastro, edição, listagem e exclusão de pessoas. Usando os métodos HTTP: POST, GET, PUT e DELETE.

Instalando o Laravel

Você pode usar o instalador do Larvel, executando o seguinte comando no bash:

$ composer global require “laravel/installer”

O Laravel será instalado de forma global. Depois você pode iniciar um aplicativo Laravel com o seguinte comando:

$ laravel new exemplo

Lembrando que exemplo será o nome da pasta de sua aplicação.

Criando projeto com composer

Você pode usar o comando create-project  do composer, que é a alternativa mais indicada para usuários Windows. Veja como fazer:

$ composer create-project laravel/laravel exemplo --prefer-dist

Será criada a pasta exemplo e dentro dela uma série de pastas e arquivos do Laravel. As principais pastas que iremos usar serão app config.

Importante

Acesse o arquivo app/Kernel.php e apague a linha

\App\Http\Middleware\VerifyCsrfToken::class,

A partir da versão 5, o Laravel usa por padrão um middleware para previnir CSRF. Como não estamos construindo um site, mas sim uma API não podemos usar este middleware

Configurando o Virtual Host

Você precisa configurar um virtual host para apontar para a pasta da sua aplicação de exemplo. Farei este exemplo usando WAMP instalado obviamente em um computador com sistema operacional Windows.

Arquivos hosts

Primeiro abra o arquivo hosts do Windows, que está em C:\Windows\System32\drivers\etc e adicione o seguinte no final:

127.0.0.1    laravel.exemplo

laravel.exemplo será o domínio para acessar nossa api.

Virtual host

Se você estiver usando Windows e WAMP o arquivo de virtual hosts estará em C:\wamp\bin\apache\apache2.4.17\conf\extra, tenha atenção à versão do apache.

Adicione o seguinte no arquivo:

<VirtualHost *:80>
    DocumentRoot "CAMINHO_PARA_PASTA_DA_API"
    ServerName laravel.exemplo
</VirtualHost>

Você deve colocar o caminho da sua API apontando para a pasta public, por exemplo: C:/wamp/www/exemplo/public

Acesse o endereço laravel.exemplo no seu navegador. Você verá a tela de demonstração do Laravel.

Lembrando a configuração do Virtual Hosts pode ser diferente em determinados sistemas operacionais.

Banco de dados

Crie um banco de dados e uma tabela simples para cadastro de pessoas.

CREATE DATABASE api;
CREATE TABLE pessoa (
	id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
	nome VARCHAR(30) NOT NULL,
	email VARCHAR(50),
	dt_cadastro DATETIME DEFAULT CURRENT_TIMESTAMP
)

Configuração

Abra o arquivo database.php que está dentro da pasta config da sua aplicação Laravel, e você verá um vetor com diversas chaves, uma delas será a connections onde você vai encontrar exemplos de conexões de bancos de dados SQLite, MySQL e PostgreSQL. Usaremos MySQL, então modifique as configurações para o seguinte:

'mysql' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'api',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ],

O Laravel conta com uma classe pronta para execução de queries e comandos no banco de dados. Em breve veremos mais sobre.

Criando Controller

O Laravel conta com uma interface de linha de comandos chamada Artisan, que serve para ajudar na criação de controllers, migração de banco de dados, etc. Você pode ter mais detalhes na documentação oficial.

Usando o prompt de comando, bash ou terminal, navegue até a pasta da sua aplicação usando o comando:

$ cd c:/wamp/www/exemplo

E depois execute o seguinte comando:

$ php artisan make:controller PessoaController

Dentro da pasta app/Http/Controllers você encontrará o arquivo PessoaController.php com o seguinte conteúdo:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

class PessoaController extends Controller
{
    //
}

Nós iremos edita-lo, para que fique assim:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

use DB; // para usar a classe DB

class PessoaController extends Controller
{
    // Listando pessoas
    public function lista(){
		return DB::select('select * from pessoa');
	}

	// Cadastrando pessoas
	public function novo(Request $request){
		$data = sizeof($_POST) > 0 ? $_POST : json_decode($request->getContent(), true); // Pega o post ou o raw

		$res = DB::insert('insert into pessoa (nome, email) values (?, ?)', [$data['nome'], $data['email']]); // Insert

		return ["status" => ($res)?'ok':'erro'];
	}

	// Editando pessoas
	public function editar($id, Request $request){
		$data = sizeof($_POST) > 0 ? $_POST : json_decode($request->getContent(), true); // Pega o post ou o raw

		$res = DB::update("update pessoa set nome = ?, email = ? WHERE id = ?",[$data['nome'], $data['email'], $id]); //Update

		return ["status" => ($res)?'ok':'erro'];
	}

	// Excluindo pessoas
	public function excluir($id){
		$res = DB::delete("delete from pessoa WHERE id = ?", [$id]); //Excluir

		return ["status" => ($res)?'ok':'erro'];
	}
}

Veja na linha 9 que evocamos a classe DB para usar o banco de dados;

Nas linhas 20 29 é verificado se existe dados enviados usando form-data ou se eles foram enviados usando raw por exemplo.

Rotas

Para usar os métodos do Controller temos que usar rotas, que usam as requisições HTTP e direcionam para os controllers e métodos corretos.

No Laravel as rotas estão no arquivo app/Http/routes.php, adicione as seguintes rotas nele:

Route::get('/pessoas', 'PessoaController@lista');

Route::post('/pessoas', 'PessoaController@novo');

Route::put('/pessoa/{id}', 'PessoaController@editar');

Route::delete('/pessoa/{id}', 'PessoaController@excluir');

Pronto, agora é só testar sua API usando algum cliente REST como o Postman, ou testando via AJAX.

Veja o projeto no GitHub.

Mais simples

Existem vários outros frameworks para construir APIs com PHP, um deles é o Slim Framework, que é na verdade um micro-framework, e é bem mais simples que o Laravel. Veja como construir uma API RESTful com PHP e Slim Framework.

Jayr Alencar

Doutorando em Ciências da Computação no Centro de Informática da Universidade Federal do Pernambuco (CIn - UFPE); Mestre pela mesma instituição; Formado em Análise e Desenvolvimento de Sistemas; Católico; Fã de O Senhor do Anéis.

Você pode gostar...

5 Resultados

  1. Jefferson Mello Olynyki disse:

    Amigo teria como ensinar a fazer com laravel 5.4?

  2. Vitor Micillo disse:

    Primeiramente, parabéns pelo artigo
    pra dar uma atualizada, no laravel 5.4 basta instalar o passport e colocar a rota em Routes/api.php
    Não precisa mais mexer no VerifyCsrfToken, e nessa versão nova o kernel.php não esta mais na pasta app.

  3. murilo disse:

    Muito boa a forma de explica as coisas, parabéns! Fiz os testes e funcionou perfeito com banco de dados mysql agora estou precisando fazer o mesmo com um banco de dados firebird. Fiz a configuração no arquivo .env e no arquivo config\database.php colocando as informações do banco mas o retorno é: InvalidArgumentException in ConnectionFactory.php line 232: Unsupported driver [firebird]
    Você já usou laravel + firebird

  1. 22 de junho de 2016

    […] alguns dias atrás vimos aqui no Clube dos Geeks um tutorial de como criar uma API RESTful usando o framework Laravel. Hoje faremos um post semelhante, mas a diferença é que faremos a comunicação entre a API […]

Deixe um comentário para Jayr Alencar Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *