Você está na página 1de 12

28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira.

Juntos Aprendemos …

@expalmer
A Javascript Enthusiast
Juntos Aprendemos Mais :)

Posts Tags GitHub RSS

November 22, 2014

Criando um Rest com Slim Framework em


poucos minutos - parte 1
php slimframework

O Slim Framework é um framework em PHP que uso


praticamente em todos meus projetos em PHP, ele é leve e
muito útil.

E juntamente com o Slim, eu uso o Illuminate Database que é um componente de ORM


onde você não precisa gastar horas criando suas classes de banco de dados para
consulta, relacionamento e tudo mais, ele abstrai toda essa parte.

Para ver o funcionamento do Slim, vamos criar uma API de cadastro de guitarras, só que
neste post vamos primeiramente criar as rotas de leitura de nosso produto.

Nos posts seguintes, iremos criar o CRUD para deixar completo nosso Rest. Também
veremos o funcionamento de um template engine e usaremos alguma lib javascript para
fazer as ações no front-end.

1) Para começar criaremos os dados!


expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 1/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …

Crie 3 tabelas abaixo no MySql:

brands: Marca da guitarra.

series: Modelo da Guitarra.

guitars: A guitarra em sí, ela terá 2 chaves estrangeiras para ( brands e series).

Alimente com esses dados:

# brands
INSERT INTO brands (id, description, created_at, updated_at) VALUES
(1, 'Gibson', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(2, 'Fender', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(3, 'Epiphone', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(4, 'PRS', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(5, 'Ibanez', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(6, 'Martin', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(7, 'Taylor', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

# series
INSERT INTO series (id, description, created_at, updated_at) VALUES
(1, 'Les Paul', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(2, 'SG', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(3, 'RD', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(4, 'Flying V', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(5, 'Firebird', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(6, 'Statocaster', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(7, 'Telecaster', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(8, 'Jaguar', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(9, 'Custom', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(10, 'Retro', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(11, 'DX', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(12, 'HD-28', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

# guitars
# informamos brand, serie e um nome para a guitarra
INSERT INTO guitars (id, fk_brands, fk_series, description, created_at, updated_at)
(1, 1, 1, 'Standart', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(2, 1, 2, 'Pro', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(3, 1, 3, 'Studio', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(4, 2, 6, 'Standart', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(5, 2, 7, 'Pro', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(6, 2, 8, 'Studio', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(7, 3, 1, 'Standart', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(8, 3, 2, 'Pro', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(9, 4, 9, 'Studio', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(10, 4, 9, 'Standart', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 2/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …

2 ) Estrutura de arquivos do APP

slim-rest
├── app
│ ├── config
│ │ └── database.php
│ ├── controllers
│ │ └── appControllers.php
│ ├── helpers
│ │ └── appHelpers.php
│ ├── models
│ │ └── appModels.php
├── .htaccess
├── composer.json
└── index.php

Nós vamos instalar o Slim com o Composer, um gerenciador de dependências PHP. Se


você não conhece ainda, essa é uma boa hora conhecer.

3) composer.json

{
"require": {
"slim/slim": "2.4.3",
"illuminate/database": "v4.2.9"
}
}

Vamos comentar as dependências.

slim/slim: Nosso framework.

illuminate/database: Nosso ORM.

4) Instalando as Dependências com Composer.


Crie o diretório do nosso projeto que chamamos de slim-rest e dentro dela baixe o
composer com o comando abaixo:

$ curl -sS https://getcomposer.org/installer | php


expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 3/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …

Esse comando vai baixar um arquivo chamado composer.phar , pois ele que vai fazer o
trabalho de instalar suas dependências.

Ainda na raiz do diretório slim-rest , dê o comando para instalar as dependências.

$ php composer.phar install

O composer vai criar um diretório chamado vendor contendo todas as suas


dependências.

Agora que baixou as dependências, vamos criar nossos arquivos.

5) index.php
Esse é nosso arquivo principal de entrada do APP.

<?php

# === constants
# ==================================================
define("_APP", dirname(__FILE__) . '/app');

# === slim
# ==================================================
require 'vendor/autoload.php';
$app = new \Slim\Slim(array(
'debug' => true
));

# === config
# ==================================================
require_once _APP . '/config/database.php';

# === helpers
# ==================================================
require_once _APP . '/helpers/appHelpers.php';

# === models
# ==================================================
require_once _APP . "/models/appModels.php";

# === controllers
# ==================================================
require_once _APP . "/controllers/appControllers.php";

expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 4/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …

# === run slim


$app->run();

6) .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

7) app/con g/database.php

<?php
// Database configuration
$settings = array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'database',
'username' => 'user',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => ''
);

use Illuminate\Database\Capsule\Manager as Capsule;


$capsule = new Capsule;
$capsule->addConnection( $settings );
$capsule->bootEloquent();

8) app/helpers/appHelpers.php
Aqui criei um helper para dar output em json.

<?php
use Slim\Slim;

class helpers {

static function jsonResponse( $error = true, $message = '', $data = array() ) {


expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 5/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …

$app = Slim::getInstance();
$response = new stdClass();
$response->error = $error;
$response->message = $message;
$response->data = $data;

$app->response()->header('Content-Type', 'application/json');
return $app->response()->body( json_encode($response) );

9) app/models/appModels.php
Aqui é onde o Illuminate reconhece nossas classes de Model, apenas crie uma classe
com extends nele, informe o nome da tabela e pronto. Cara, ele é muito útil e possui
muitos outros recursos que fará você ganhar tempo em seus projetos.

Para saber como usar mais recursos do Illuminate, olhe a documentação no site do
Laravel, pois ele usa esse component também.

<?php

class Brands extends Illuminate\Database\Eloquent\Model


{
protected $table = 'brands';
}

class Series extends Illuminate\Database\Eloquent\Model


{
protected $table = 'series';
}

class Guitars extends Illuminate\Database\Eloquent\Model


{
protected $table = 'guitars';

public function Brand() {


return $this->hasOne('Brands','id', 'fk_brands');
}

public function Serie() {


return $this->hasOne('Series','id', 'fk_series');

expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 6/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …

}
}

10) app/controllers/appControllers.php

<?php

# === api
# ==================================================
$app->get('/api/v1/brands', function() use ($app) {

$results = Brands::all();
return helpers::jsonResponse(false, 'results', $results );

});

$app->get('/api/v1/series', function() use ($app) {

$results = Series::all();
return helpers::jsonResponse(false, 'results', $results );

});

$app->get('/api/v1/guitars', function() use ($app) {

$results = [];
$description = $app->request->get('description');
if ( $description ) {
$results = Guitars::with('Brand')
->with('Serie')
->where('description','LIKE',"%{$description}%")
->get();
} else {
$results = Guitars::with('Brand')
->with('Serie')
->get();
}
$message = $results->count() . ' results';
return helpers::jsonResponse(false, $message, $results );

});

Pronto!!!

expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 7/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …

Agora abra seu browser no endereço do seu APP, no meu caso é


http://localhost/slim-rest/ , então as rotas caram assim:

http://localhost/slim-rest/api/v1/brands : As marcas.

http://localhost/slim-rest/api/v1/series : Os modelos.

http://localhost/slim-rest/api/v1/guitars : As guitarras com sua respectiva


marca e modelo.

Temos também uma pequena busca no campo description na rota guitars, testa assim:
http://localhost/slim-rest/api/v1/guitars?description=a .

Então isso é só o começo, podemos criar muitas coisas em cima disso.

Não expliquei detalhadamente cada arquivo, mas se você tiver alguma dúvida pode me
perguntar que terei o prazer em ajuda-lo. Caso tenha alguma dica de melhoria, será bem
vinda!

Concluindo, o Slim é muito bacana pois em minutos você levanta uma aplicação bem
organizada, rápida e segura. Note que usamos o Illuminate para pegar os dados do
banco, inclusive com join e outras tabelas, e tudo isso de uma forma simples.

Com pouco código já temos nosso Rest de nido!

Obrigado por ler, e até o próximo post.

That's it!

16 Comments Palmer Oliveira - Juntos aprendemos mais. 


1 Login

 Recommend 4 t Tweet f Share Sort by Best

Join the discussion…

LOG IN WITH
OR SIGN UP WITH DISQUS ?

Name

Greenomac Da Silva Dias • 10 months ago


Palmer me tira uma dúvida, como faria para buscar todas as guitarras pelo nome da marca
em vez da descrição dela?
△ ▽ • Reply • Share ›

Palmer Mod > Greenomac Da Silva Dias • 10 months ago

Opa...faz assim..usando whereHas


expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 8/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …
p
$results = Guitars::with('Brand')
->with('Serie')
->whereHas('Brand', function($q) {
$q->where('description','LIKE',"%{$description}%");
})->get();
△ ▽ • Reply • Share ›

Greenomac Da Silva Dias > Palmer • 10 months ago


Obrigado pelo retorno amigo, porém ele não reconhece a variável $description
na função anônima.
△ ▽ • Reply • Share ›

Show more replies

Maganius • 2 years ago


I have this issue

Type: Illuminate\Contracts\Container\BindingResolutionException

Message: Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable.

File: vendor\illuminate\container\Container.php

Line: 763
△ ▽ • Reply • Share ›

Palmer Mod > Maganius • 2 years ago

What are the slim version that you are using ?


△ ▽ • Reply • Share ›

Maganius > Palmer • 2 years ago


Slim 3, I like your guide but I think its not compatible with slim 3.
△ ▽ • Reply • Share ›

Show more replies

gilbnet • 3 years ago


Muito bom. consegui acompanhar direitinho. Vejo por aí que não é boa pratica criar mais de
uma classe por arquivo, eu poderia separar as classes?
Ex.
class Brands extends Illuminate\Database\Eloquent\Model
{
protected $table = 'brands';
}

class Series extends Illuminate\Database\Eloquent\Model


{
protected $table = 'series';
}
Criar um app Series ou appBrands?
expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 9/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …

E ali no appHelper você utilizou a composição né?

Parabéns pelo artigo, contribui demais com a comunidade. Valeu.


△ ▽ • Reply • Share ›

Palmer Mod > gilbnet • 3 years ago


Obrigado rapaz. Faz isso, separa as classes. No appHelper só incluí ele e pego uma
instância do Slim, para retornar em json.
△ ▽ • Reply • Share ›

Victor Cechinel • 3 years ago


É possível criar mais de uma classe de Models? Você diz ali no post "apenas uma classe", vou
ter problema se criar mais de uma?
△ ▽ • Reply • Share ›

Palmer Mod > Victor Cechinel • 3 years ago


E ai @Victor Cechinel . Sim é possível, cria a classe e coloca o mesmo namespace e
na mesma pasta.
△ ▽ • Reply • Share ›

Joel Schecheleski • 3 years ago


SCRIPT SQL:

# brands
DROP TABLE IF EXISTS `brands`;
CREATE TABLE IF NOT EXISTS `brands` (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
description VARCHAR(50),
created_at DATETIME,
updated_at DATETIME
);
INSERT INTO `brands` (id, description, created_at, updated_at) VALUES
(1, 'Gibson', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(2, 'Fender', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(3, 'Epiphone', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(4, 'PRS', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(5, 'Ibanez', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(6, 'Martin', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP),
(7, 'Taylor', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

see more

△ ▽ • Reply • Share ›

This comment was deleted.


Avatar

Palmer Mod > Guest • 4 years ago

Olá Michele, obrigado pelo feedback!

As rotas não tem relação com os arquivos em sí Você cria uma rota e quando a URL
expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 10/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …
As rotas não tem relação com os arquivos em sí. Você cria uma rota e quando a URL
bater com a rota, você faz o que precisa ( retorna um json, chama um arquivo para
renderizar, redireciona, etc... ).

Vamos ver se entendi tua dúvida...exemplo...digamos que tenha 2 sistemas de admin,


um deles uma LOJA, e outro uma FARMACIA. então você criaria as rotas e as pastas
com os arquivos ...

Rotas da Loja =>

$app->get('/loja/login', function() use ($app) ... pasta views/loja/login.php


$app->get('/loja/listar', function() use ($app) ... pasta views/loja/listar.php
$app->get('/loja/inserir', function() use ($app) ... pasta views/loja/inserir.php
$app->get('/loja/alterar/:id', function($id) use ($app) ... pasta views/loja/alterar.php

Rotas da Farmácia =>


$app->get('/farmacia/login', function() use ($app) ... pasta views/farmacia/login.php
$app->get('/farmacia/listar', function() use ($app) ... pasta views/farmacia/listar.php
$app->get('/farmacia/inserir', function() use ($app) ... pasta
views/farmacia/inserir.php
$app->get('/farmacia/alterar/:id', function($id) use ($app) ... pasta
views/farmacia/alterar.php

Não sei se conseguiu entender, mas você criar as rotas e chama os arquivos como
quiser. Acima fiz um exemplo de como ficar mais organizado, criando uma pasta
/views/ + nome do sistema + / + nome do arquivo que será chamado pela rota
respectiva.

Caso não tenha entendido, ou se não era essa a dúvida, é só me perguntar.


△ ▽ • Reply • Share ›

This comment was deleted.


Avatar

Show more replies

Romulo Bosco • 4 years ago


Cara, que bacana!!! Estou a espera dos proximos.
△ ▽ • Reply • Share ›

Palmer Mod > Romulo Bosco • 4 years ago

Obrigado Romulo, pode deixar, logo já sai o próximo.


△ ▽ • Reply • Share ›

Marcus Cavalcanti • 4 years ago


Muito bom, parabéns cara!
△ ▽ • Reply • Share ›

Palmer Mod > Marcus Cavalcanti • 4 years ago

Obrigado pelo feedback @Marcus Cavalcanti.:disqus


△ ▽ • Reply • Share ›
expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 11/12
28/04/2019 Criando um Rest com Slim Framework e Illuminate Database em poucos minutos - parte 1 - Palmer Oliveira. Juntos Aprendemos …

ALSO ON PALMER OLIVEIRA - JUNTOS APRENDEMOS MAIS.

Criando um Blog Estatico com Metalsmith Paginando nosso blog estático em


contendo tags, gists, drafts e um rss feed Metalsmith | Palmer Oliveira. Juntos
13 comments • 5 years ago 4 comments • 4 years ago
Palmer — KKK e aí irmão como está ? Legal Palmer — Show cara, fazer o blog com
Avatarcara! Que bom que gostou, e obrigado pelo Avatarmetalsmith é divertido. Logo vou fazer uns
feedback pois isso é gratificante! Se vemos nos posts ensinando a fazer seu próprio

Criando um Rest com Slim Framework e Criando seu proprio Array Reduce em
Illuminate Database em poucos minutos - Javascript | Palmer Oliveira. Juntos …
31 comments • 4 years ago 4 comments • 3 years ago

Made with Metalsmith. View Source

expalmer.github.io/criando-um-rest-com-slim-framework-e-illuminate-database-em-poucos-minutos-parte-1/ 12/12