PHPのslim3でデータベースに接続する

今回はデータベースに接続する設定を追加します。

DBに接続するライブラリは以下を使います。

github.com

composer.jsonに以下の設定を追加してcomposer updateします。

composer.json
@@ -15,6 +15,7 @@
         "php": ">=5.5.0",
         "slim/slim": "^3.1",
         "slim/twig-view": "2.2.0",
+        "illuminate/database": "v5.4.13",

MySQLに接続する環境はできてるとしてMySQLに以下のコマンドでテーブルを追加します

CREATE DATABASE sample default character set utf8;
GRANT ALL ON sample.* TO sample@'%' IDENTIFIED BY 'password';
CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ユーザID',
      `name` varchar(256) NOT NULL COMMENT 'ユーザ名',
      `created_at` datetime NOT NULL COMMENT '登録日',
      `updated_at` datetime NOT NULL COMMENT '更新日',
      PRIMARY KEY (`id`)
);
INSERT INTO user VALUES (1,'test_user',now(),now());

settings.phpMySQL用の接続設定を追加します

src/settings.php
     'settings' => [
         'displayErrorDetails' => true, // set to false in production
         'addContentLengthHeader' => false, // Allow the web server to send the content-length header
+        'determineRouteBeforeAppMiddleware' => false,
+        'displayErrorDetails' => true,
+
+        'db' => [
+            'driver' => 'mysql',
+            'host' => 'mysql-server',
+            'database' => 'sample',
+            'username' => 'sample',
+            'password' => 'password',
+            'charset'   => 'utf8',
+            'collation' => 'utf8_unicode_ci',
+            'prefix'    => '',
+        ],

dependencies.phpにdb用のコンテナ設定を追加します

src/dependencies.php
@@ -3,6 +3,16 @@

 $container = $app->getContainer();

+$container['db'] = function ($c) {
+    $capsule = new \Illuminate\Database\Capsule\Manager;
+    $capsule->addConnection($c['settings']['db']);
+    $capsule->setAsGlobal();
+    $capsule->bootEloquent();
+    return $capsule;
+};

最後にコントローラに以下のようにDBにアクセスするコードを記述します。

src/Sample/Controller/TopController.php
@@ -15,6 +15,7 @@ class TopController
     public function index($request, $response, $args)    {
+        $user = $this->container['db']->table('user')->find(1);
+        return $this->container['renderer']->render($response, 'top/index.twig', ['message' => 'Hello '.$user->name]);
     }
 }

これでアクセスするとDBの内容が表示されるようになります