slim入門:PDOを利用したMariaDBからのデータ取得

スポンサーリンク
slim入門:PDOを利用したMariaDBからのデータ取得 環境構築
slim入門:PDOを利用したMariaDBからのデータ取得
この記事は約10分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、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の略称になります。

本記事でご紹介したソースは、下記のリポジトリにあります。

よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました