CakePHP 5で「CakePHP is NOT able to connect to the database.」

CakePHP

記事内に広告が含まれています。

おつかれさまです。すぺきよです。

仕事でCakePHP5を使う機会があり、チュートリアル中です。

初期セットアップなどはうまく行き、Dockerを使用して環境構築も成功。

DBの設定をconfig/app.phpに設定するも「CakePHP is NOT able to connect to the database.」というエラーが出てDBに接続がうまく行きませんでした。

試行錯誤してなんとか接続成功まで持っていけたので、ここまでのセットアップ手順と解決方法を共有します。

私のたどり着いた解決策

急いでいる方のために、私がたどり着いた解決策から書きます。

app_local.phpのDatasources.defaultの中身を全て消す(コメントアウトする)

CakePHP5で初期に作成されるファイルの中に「config/app_local.php」なるファイルが存在します。

チュートリアルの中では「config/app.php」にデータベースのホスト名などを書けと言われていますが、ここにいくらパラメータを設定しても「config/app_local.php」で同様のパラメータを設定していると「config/app_local.php」の方が勝つみたいです。

なぜこれで行けるのか

CakePHPのチュートリアルにも確かに下記記載があります。

出典:CakePHP 公式

そう、チュートリアルにあるとおり「config/app.php」を触っても「config/app_local.php」に別の設定をしていたら意味がないということですね。

なんで最初からこんな構造になっているんだろう。5.3.2の問題かな・・・?

これまでの手順

Dockerファイルの作成

開発サーバーは用意するのが面倒だったので手軽にDockerで作成。

Dockerfileの中身がこれ。

FROM php:8.5-apache

# intl に必要なライブラリ
RUN apt-get update \
    && apt-get install -y libicu-dev \
    && docker-php-ext-install intl pdo_mysql mysqli \
    && rm -rf /var/lib/apt/lists/*

RUN a2enmod rewrite

ENV APACHE_DOCUMENT_ROOT=/var/www/html/webroot
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' \
    /etc/apache2/sites-available/*.conf \
    /etc/apache2/apache2.conf \
    /etc/apache2/conf-available/*.conf

WORKDIR /var/www/html

起動するのにdocker-compose.ymlを用意。中身がこれ。

version: "3.8"

services:
  web:
    build: ./Docker
    container_name: php85-web
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
    depends_on:
      - db

  db:
    image: mariadb:10.11
    container_name: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: cms
      MYSQL_USER: cmsuser
      MYSQL_PASSWORD: cmspass
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"

volumes:
  db_data:

Dockerfileとdocker-compose.ymlは以下の構造になるように配置。

/<project-root>/
┣ Doekr/
┃┗ Dockerfile
┗ docker-composer.yml

この状態でターミナルやコマンドプロンプトを開き<project-root>に移動してから、次のコマンドでDockerを起動する。

docker compose up -d

app.configを書き換え

チュートリアルにある通り「config/app.php」を書き換えます。

今回は下記のように書き換えました。(元々あったコメントは省略)

    'Datasources' => [
        'default' => [
            'className' => Connection::class,
            'driver' => Mysql::class,
            'persistent' => false,
            'timezone' => 'UTC',
            'host' => 'db',
            'port' => 3306,
            'username' => 'cmsuser',
            'password' => 'cmspass',
            'database' => 'cms',
            'encoding' => 'utf8mb4',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,
            'quoteIdentifiers' => false,
        ],

app_localのdatabase設定を削除

ここがミソです。

「config/app_local.php」のdatabases.defaultの中身を削除して空にします。

    'Datasources' => [
        'default' => [
        ],

無事に繋がったみたい

ここまでやって、「localhost:8080」に接続すると、Databaseの接続が緑になることが確認できました。

コメント

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