こんにちは。よっしーです(^^)
今日は、slimのローカル開発環境でPDOを利用したDBからのデータ取得についてご紹介します。
前提
この記事は下記の記事をベースにしています。
背景
MariaDBを導入したので、今回は、PDOを利用してMariaDBからデータを取得するAPIを作成した方法をご紹介します。
修正内容
下記のファイルを修正、新規作成します。
modified: app/php-fpm/Dockerfile
modified: app/php-fpm/slim_app/.env
modified: app/php-fpm/slim_app/app/dependencies.php
modified: app/php-fpm/slim_app/app/routes.php
modified: app/php-fpm/slim_app/app/settings.php
app/php-fpm/Dockerfile
9行目に追記します。
+RUN docker-php-ext-install pdo_mysql
app/php-fpm/slim_app/.env
4行目に追記します。
+MARIADB_HOST=mariadb
+MARIADB_PORT=3306
+MARIADB_DBNAME=sample
+MARIADB_CHARSET=utf8mb4
+MARIADB_USER=app_user
+MARIADB_PASS=P@ssw0rd
app/php-fpm/slim_app/app/dependencies.php
38行目に追記します。
+ PDO::class => function (ContainerInterface $c) {
+ $settings = $c->get(SettingsInterface::class);
+
+ $mariadbSettings = $settings->get('mariadb');
+
+ //PDO設定
+ $host = $mariadbSettings['host'];
+ $port = $mariadbSettings['port'];
+ $dbname = $mariadbSettings['dbname'];
+ $charset = $mariadbSettings['charset'];
+ $user = $mariadbSettings['user'];
+ $pass = $mariadbSettings['pass'];
+ $option = array(
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
+ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
+ PDO::ATTR_EMULATE_PREPARES => true,
+ PDO::ATTR_STRINGIFY_FETCHES => false,
+ );
+ $dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=%s;', $host, $port, $dbname, $charset);
+
+ $pdo = new \PDO($dsn, $user, $pass, $option);
+ return $pdo;
+ },
app/php-fpm/slim_app/app/routes.php
38行目に追記します。
+ $app->get('/testmariadb', function (Request $request, Response $response) {
+ $pdo = $this->get(PDO::class);
+ $stmt = $pdo->query('SELECT * from `sample`');
+ $data = $stmt->fetchAll();
+ $json = json_encode($data, JSON_PRETTY_PRINT);
+ $response->getBody()->write($json);
+ return $response;
+ });
app/php-fpm/slim_app/app/settings.php
28行目に追記します。
+ 'mariadb' => [
+ 'host' => $_ENV['MARIADB_HOST'],
+ 'port' => $_ENV['MARIADB_PORT'],
+ 'dbname' => $_ENV['MARIADB_DBNAME'],
+ 'charset' => $_ENV['MARIADB_CHARSET'],
+ 'user' => $_ENV['MARIADB_USER'],
+ 'pass' => $_ENV['MARIADB_PASS'],
+ ],
動作確認
下記のコマンドを実行します。
make up
make migrate_up
ブラウザで「http://localhost:8080/testmariadb」にアクセスして、下図のような表示になっていれば成功です。
解説
app/php-fpm/slim_app/app/dependencies.php
このコードは、PHPの依存性注入コンテナを使用して、PDO(PHP Data Objects)のインスタンスを作成するための設定を行っています。
PDO::class => function (ContainerInterface $c) { ... }
は、PDOクラスのインスタンスを生成するための無名関数を定義しています。この関数は、引数としてContainerInterface
インターフェースを受け取ります。
$settings = $c->get(SettingsInterface::class);
は、コンテナからSettingsInterface
のインスタンスを取得しています。これは、アプリケーションの設定情報へのアクセスを提供するオブジェクトです。
$mariadbSettings = $settings->get('mariadb');
は、mariadb
というキーで設定情報を取得しています。この設定情報には、MariaDBデータベースへの接続に必要なホスト名、ポート番号、データベース名、文字セット、ユーザー名、パスワードなどが含まれています。
次の行では、PDOのオプション設定を行っています。PDO::ATTR_ERRMODE
は、エラーレポートのモードを指定し、PDO::ERRMODE_EXCEPTION
は例外をスローすることでエラーを報告するモードを表します。PDO::ATTR_DEFAULT_FETCH_MODE
は、デフォルトの取得モードを指定しており、PDO::FETCH_ASSOC
は連想配列として結果を取得するモードを表します。PDO::ATTR_EMULATE_PREPARES
は、プリペアドステートメントをエミュレートするかどうかを指定します。PDO::ATTR_STRINGIFY_FETCHES
は、結果のフェッチ時に文字列に変換するかどうかを指定します。
$dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=%s;', $host, $port, $dbname, $charset);
は、DSN(Data Source Name)と呼ばれる接続文字列を作成しています。DSNは、データベースへの接続に必要な情報を含んでおり、mysql:host=
の後にホスト名、port=
の後にポート番号、dbname=
の後にデータベース名、charset=
の後に文字セットが指定されています。
最後の行では、作成したDSNやユーザー名、パスワード、オプションを使用して、新しいPDOインスタンスを作成しています。作成したPDOインスタンスが関数の戻り値となります。
この設定を利用すると、コードの他の部分でPDO
クラスを型指定したパラメータとして受け取る場合、依存性注入コンテナが自動的にこの設定を適用してPDOのインスタンスを提供してくれます。
app/php-fpm/slim_app/app/routes.php
このコードは、Slim Frameworkのルート定義の一部です。/testmariadb
というパスにGETリクエストが送信された際に実行される処理を定義しています。
function (Request $request, Response $response) { ... }
は、無名関数を定義しています。この関数は、Slim Frameworkによって呼び出され、HTTPリクエストとレスポンスオブジェクトが引数として渡されます。
$pdo = $this->get(PDO::class);
は、依存性注入コンテナからPDOクラスのインスタンスを取得しています。Slim Frameworkでは、$this->get()
を使用してコンテナからオブジェクトを取得することができます。
$stmt = $pdo->query('SELECT * from
sample');
は、PDOインスタンスのquery()
メソッドを使用して、指定されたSQLクエリを実行しています。この場合は、sample
テーブルから全てのレコードを取得するクエリを実行しています。
$data = $stmt->fetchAll();
は、実行したクエリの結果セットをすべて取得し、連想配列として$data
変数に格納しています。fetchAll()
メソッドは、結果セットの全ての行を取得します。
$json = json_encode($data, JSON_PRETTY_PRINT);
は、取得したデータをJSON形式に変換しています。json_encode()
関数を使用して連想配列をJSON文字列に変換しています。JSON_PRETTY_PRINT
オプションを指定することで、出力されるJSON文字列が整形されます。
$response->getBody()->write($json);
は、レスポンスオブジェクトのボディにJSON文字列を書き込んでいます。getBody()
メソッドは、レスポンスボディを表すストリームオブジェクトを返します。write()
メソッドを使用して、ストリームにJSON文字列を書き込んでいます。
最後の行のreturn $response;
は、処理が完了した後にレスポンスオブジェクトを返しています。これにより、Slim Frameworkが正しいHTTPレスポンスをクライアントに送信します。
要約すると、このコードは/testmariadb
パスに対するGETリクエストが行われた時に、データベースからデータを取得し、JSON形式でレスポンスを返す処理を行っています。
おわりに
今日は、slimのローカル開発環境でPDOを利用したDBからのデータ取得についてご紹介しました。
slimフレームワークは、ADRというPaul M. Jonesによって提案されたソフトウェアアーキテクチャパターンを採用しているので、それに従った形で実装をしてみたいと思います。
ADRは、Action Domain Responderの略称になります。
本記事でご紹介したソースは、下記のリポジトリにあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント