Archivos de Categoría: Slim

API Restful con Slim

Sigo haciendo pruebas con Slim y cada vez me gusta más, creo que voy a terminar usándolo en algún proyecto. Dejo un ejemplo en https://github.com/ErTomy/API-RESTful-Slim , aún estoy viendo si es necesario montar controladores o con tener la lógica en los ficheros de ruta puede servir (para servicios básicos no creo que sea necesario complicarlo mucho más)

Primeras pruebas con el framework Slim

De vez en cuando me gusta echar un vistazo a otros frameworks a parte de mi querido Laravel, y esta vez me ha dado por probar Slim y la verdad que me ha sorprendido de lo facilito que parece al menos para crear una API Restful, luego habría que ver qué tal se da para desarrollar una web entera.

Lo primero es crear el proyecto de Slim con la base:

composer create-project slim/slim-skeleton prueba

Con esto tenemos la estructura básica por lo que tendremos que prepararla para que se pueda conectar a la base de datos, para ello primero configuramos los datos de conexión a la base de datos en el fichero src/settings.php:

// Database connection settings
"db" => [
   'driver' => 'mysql',
   'host' => '127.0.0.1',
   'database' => 'prueba',
   'username' => 'user',
   'password' => 'pass',
   'collation' => 'utf8_general_ci',
   'charset' => 'utf8',
   'prefix' => ''
],

Y añadimos Eloquent al proyecto:

composer require illuminate/database

Después en el fichero de public/index.php añadiremos las siguientes líneas $app->run(); que aparece al final:

/* instanciar eloquent */
$container = $app->getContainer();
$dbSettings = $container->get('settings')['db'];
$capsule = new Illuminate\Database\Capsule\Manager;
$capsule->addConnection($dbSettings);
$capsule->bootEloquent();
$capsule->setAsGlobal();

En este caso vamos a conectarnos a una tabla con la siguiente estructura (netemos datos de prueba ya que estamos):

CREATE TABLE `tareas` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`tarea` VARCHAR(250) NOT NULL,
`estado` ENUM('Pendiente','Finalizada') NOT NULL DEFAULT 'Pendiente',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
INSERT INTO `tareas` (`id`, `tarea`, `estado`) VALUES
(1, 'La primera', 'Pendiente'),
(2, 'La segunda', 'Finalizada'),
(3, 'La tercera', 'Finalizada'),
(4, 'La cuarta',  'Pendiente');

Podríamos usar consultas a pelo en el fichero src/routes.php pero vamos a usar modelos de datos, para ello primero nos creamos una carpeta app/models:

$ mkdir -p app/models

Y en el fichero composer.json habilitamos el PSR-4 para que haga el autoload de las clases:

"autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    },

El siguiente paso sería crear el modelo de datos que es bastante sencillito, creamos el fichero app/models/Tarea.php:

namespace App\Models;

class Pedido extends \Illuminate\Database\Eloquent\Model {

}

Pero para que tenga efecto tendremos que actualizar el composer (tendremos que ejecutarlo cada vez que creemos un modelo):

composer dump-autoload --optimize

Y ya por ultimo solo quedaría preparar las rutas en el fichero src/routes.php, en este caso voy a crear la ruta /api/tareas para que devuelva el listado de todas las tareas y /api/tarea/{id} para que cargue una tarea en concreto:

use Slim\Http\Request;
use Slim\Http\Response;
use App\Models\Tarea;


$app->group('/api', function() use ($app) {
    $app->get('/tareas', function ($request, $response, $args) {
        $todos = Tarea::all();
        return $this->response->withJson($todos);
    });

    $app->get('/tarea/[{id}]', function ($request, $response, $args) {
        $todo = Tarea::find($args['id']);
        return $this->response->withJson($todo);
    });
});