[PHP]Slim3でPDOを使用する最小限のプログラム

カテゴリ: SlimFramework

Slim3 FrameworkでPDOを使用したDBアクセスを行いたい場合があります。

Slim3では、システム全体で使用するオブジェクトの管理をDIコンテナに任せることができる為、DIコンテナ経由でPDOオブジェクトの取得を行う方がスマートです。

下記は、PDOオブジェクトをDIコンテナから取得する最低限のコード例です。

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require 'vendor/autoload.php';

$app = new \Slim\App;

// PDOオブジェクトの生成処理をDIコンテナに登録する
$container = $app->getContainer();
$container['pdo'] = function ($c) {
    $dbhost="localhost";
    $dbuser="root";
    $dbpass="password";
    $dbname="test_db";
    $dbConnection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $dbConnection;
};


$app->get('/', function (Request $request, Response $response) {    
    // ユーザ情報を検索
    $sql = "select * from USERS limit 10;";

    try {
        // DIコンテナからpdoオブジェクトを取得する
        $db = $this->pdo;

        $stmt = $db->query($sql);
        $users = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;

        print_r($users);
    } catch(PDOException $e) {
        echo $e->getMessage();
    }
});

$app->run();

DB接続に関する情報を外部に出力する

上記のコードだと、DB接続のパスワードなどがphpコードにハードコーディングされているため、セキュリティ上望ましくないです。

これを防ぐためには、phpdotenvを利用するのが良いです。

phpdotenvは、composerがインストールされていれば下記のコマンドでインストールが可能です

composer require vlucas/phpdotenv

先ほどのコードをphpdotenv使用したバージョンに置き換えると下記のようになります。

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use \Dotenv\Dotenv;

require 'vendor/autoload.php';

// load .env
$dotenv = new Dotenv(__DIR__ . "/..");
$dotenv->load();


$app = new \Slim\App;

// DBオブジェクトを取得する
$container = $app->getContainer();
$container['pdo'] = function ($c) {
    $dbhost = getenv('db.host');
    $dbuser = getenv('db.user');
    $dbpass = getenv('db.pass');
    $dbname = getenv('db.name');

    $dbConnection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    return $dbConnection;
};


$app->get('/', function (Request $request, Response $response) {    
    // ユーザ情報を検索
    $sql = "select * from USERS limit 10;";
    try {
        $db = $this->pdo;
        $stmt = $db->query($sql);
        $users = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;

        print_r($users);
    } catch(PDOException $e) {
        echo $e->getMessage();
    }
});

$app->run();

パスワード情報は、名前が".env"のファイルに記載します。

db.host="localhost"
db.user="root"
db.pass="password"
db.name="test_db"

プログラムをgitで管理する場合、.gitignoreファイルに.envを書いておき、パスワード情報が誤ってバージョン管理されないようにしておくのが一般的です。

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。