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を書いておき、パスワード情報が誤ってバージョン管理されないようにしておくのが一般的です。
こちらもおススメ