Conectar Slim Framework a MySQL/MariaDB


   He visto muchos proyectos que utilizan Slim Framework para crear APIs sencillas en PHP, y muchos emplean una función para conectarse a la Base de Datos como la siguiente:
function connect_db() {
  $server    = 'localhost'; 
  $user      = 'user';
  $pass      = 'pass';
  $database  = 'slim_db';

  $connection = new mysqli($server, $user, $pass, $database);

  return $connection;
}
   Todo bien para algo sencillo pero ¿qué pasa si el proyecto es algo grande o necesita ser escalable?, es cuando debemos modificar un poco el código, como el objetivo es hacer la aplicación lo mas escalable posible entonces vamos a utilizar PDO.

   Primero modificamos src/settings.php:
// Database settings
'db' => [
  'host' => 'localhost',
  'dbname' => 'mysql-db',
  'user' => 'mysql-user',
  'pass' => 'mysql-pass'

],
   Ahora vamos con src/dependencies.php:
// 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;
};
   Ya solo nos resta definir las rutas, para consultar usuarios por ejemplo:
$app->get('/test/[{id}]', function ($request, $response, $args) {
  $stmt = $this->db->prepare("SELECT * FROM usuarios WHERE id=:id");
  $stmt->bindParam("id", $args['id']);
  $stmt->execute();
  $data = $stmt->fetchObject();

  return $this->response->withJson($data);
});
   IMPORTANTE: si vamos a trabajar con caracteres especiales (tildes / acentos) entonces debemos iniciar la conexión de la siguiente manera:
$pdo = new PDO("mysql:host=" . $settings['host'] . ";dbname=" . $settings['dbname'], $settings['user'], $settings['pass'],
      array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
   Este atributo no puede ser definido una vez se realiza la conexión, por lo que es necesario enviarlo como parámetro en el constructor, mas información: PHP PDO MySQL


Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión