Slim 3 crear api rest

Slim es un micro framework php que nos ayuda a crear facilmente API rest,

si usas xampp, abrir la consola de windows y situarse en xampp/htdocs, luego:

 instalacion:
composer create-project slim/slim-skeleton [nombre_proyecto]

en el ejemplo, nombre_proyecto es "apidemo",

entonces,la estructura del proyecto quedará asi


si estas usando xampp y creaste el proyecto en htdocs, puedes entrar a la pagina de inicio
asi, (en este ejemplo el proyecto se llama apidemo)

http://localhost/apidemo/public/

vamos a crear ahora una base de datos (por facilidad se llamará igual que el proyecto)

dentro crearemos la tablas "tasks",
para eso ejecutaremos el sgt script

CREATE TABLE IF NOT EXISTS `tasks` (
  `id` int(11) NOT NULL,
  `task` varchar(200) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `tasks` ADD PRIMARY KEY (`id`);
ALTER TABLE `tasks` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

agregamos unos cuantos registros
INSERT INTO `tasks` (`id`, `task`, `status`, `created_at`) VALUES
(1, 'Find bugs', 1, '2016-04-10 23:50:40'),
(2, 'Review code', 1, '2016-04-10 23:50:40'),
(3, 'Fix bugs', 1, '2016-04-10 23:50:40'),
(4, 'Refactor Code', 1, '2016-04-10 23:50:40'),
(5, 'Push to prod', 1, '2016-04-10 23:50:50');


************
ahora configuraremos nuestra base de datos, abrimos src/settings.php
y le agregamos la sgt entrada
'db' => [
    'host' => 'localhost',
    'dbname' => 'apidemo',
    'user' => 'root',
    'pass' => ''

    ],
************
ahora nos queda configurar la libreria de base de datos, usamos PDO (o PHP Data Objects) que es una extensión que provee una capa de abstracción de acceso a datos para PHP

vamos a usar inyeccion de dependencias para inyectar el objeto en el container.

abrimos src/dependencies.php

y ahi agregamos

// PDO database library
$container['db'] = function ($c) {
    $settings = $c->get('settings')['db'];
    $pdo = new PDO("mysql:host=" . $settings['host'] . ";dbname=" . $settings['dbname'],
        $settings['user'], $settings['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    return $pdo;
};


 ************
vamos a implementar las sgts llamadas de API
Method       URL                                                         Action 
GET          /tareas                                                    Devuelve todas las tasks
 GET         /tarea/search/code busca las tasks que tengan la palabra 'code’ en su nombre 
GET          /tarea/1                                                  devuelve la task con id == 1 
POST       /tareaAdd                                               agrega una nueva task 
PUT          /tarea/1                                                  actualiza una task con id == 1 
DELETE   /tarea/1                                                   elimina una task con id == 1 
************

vamos a implementar estas llamadas en src/routes.php

// obtiene todas las tasks 
    $app->get('/tareas', function ($request, $response, $args) {
         $sth = $this->db->prepare("SELECT * FROM tasks ORDER BY task");
        $sth->execute();
        $todos = $sth->fetchAll();
        return $this->response->withJson($todos);
    });

lo llamamos asi:
http://localhost/apidemo/public/tareas

// obtiene el task con un determinado id
    $app->get('/tarea/[{id}]', function ($request, $response, $args) {
         $sth = $this->db->prepare("SELECT * FROM tasks WHERE id=:id");
        $sth->bindParam("id", $args['id']);
        $sth->execute();
        $todos = $sth->fetchObject();
        return $this->response->withJson($todos);
    });

lo
llamamos asi
http://localhost/apidemo/public/tarea/2


    // Search for todo with given search teram in their name
    $app->get('/tareas/search/[{query}]', function ($request, $response, $args) {
         $sth = $this->db->prepare("SELECT * FROM tasks WHERE UPPER(task) LIKE :query ORDER BY task");
        $query = "%".$args['query']."%";
        $sth->bindParam("query", $query);
        $sth->execute();
        $todos = $sth->fetchAll();
        return $this->response->withJson($todos);
    });

 ************
http://localhost/apidemo/public/tareas/search/code
 ************


    // Add a new todo
    $app->post('/tarea', function ($request, $response) {
        $input = $request->getParsedBody();
        $sql = "INSERT INTO tasks (task) VALUES (:task)";
         $sth = $this->db->prepare($sql);
        $sth->bindParam("task", $input['task']);
        $sth->execute();
        $input['id'] = $this->db->lastInsertId();
        return $this->response->withJson($input);
    });

para probar esto, podriamos abrir una ventana de Postman similar a la de la figura

y desde ahi hacer la llamada
http://localhost/apidemo/public/tarea



 ************

    // DELETE a todo with given id
    $app->delete('/tarea/[{id}]', function ($request, $response, $args) {
         $sth = $this->db->prepare("DELETE FROM tasks WHERE id=:id");
        $sth->bindParam("id", $args['id']);
        $sth->execute();
        $todos = $sth->fetchAll();
        return $this->response->withJson($todos);
    });


************
PHP
// Update todo with given id
    $app->put('/tarea/[{id}]', function ($request, $response, $args) {
        $input = $request->getParsedBody();
        $sql = "UPDATE tasks SET task=:task WHERE id=:id";
         $sth = $this->db->prepare($sql);
        $sth->bindParam("id", $args['id']);
        $sth->bindParam("task", $input['task']);
        $sth->execute();
        $input['id'] = $args['id'];
        return $this->response->withJson($input);
    });


2 comentarios:

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable