Foto de um Panda de Óculos

@expalmer

A Javascript Enthusiast

Juntos Aprendemos Mais :)

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!

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) VALUES
  (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);

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

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

# === run slim
$app->run();

6) .htaccess

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

7) app/config/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() ) {

    $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');
  }
}

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

Agora abra seu browser no endereço do seu APP, no meu caso é http://localhost/slim-rest/, então as rotas ficaram 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 definido!

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

That's it!