CakePHP4の環境構築

普段の業務はほぼLaravel一択なので、CakePHP4の環境構築で色々と調査した。
以下にメモを残しておく。

# 前提・背景等
- CakePHP4 
    - php8.1
    - mysql8
- ソースコード状態の評価と、アプリケーションに対する新規機能追加の見積もりを行いたい。
    - なので、とりあえずローカルで動作する環境を作れればOK

# 概要
- PHPとMysqlのコンテナがあればとりあえず動くやろの精神
    - （後からわかったが）いくつかphp のextensionが必要
- （後からわかったが）メール送信する機能もあったのでMailpitも入れといた

# 成果物
## docker関連
ファイル、ディレクトリの構成は以下の要領
```
.env
docker-compose-local.yml
docker/local/php/Dockerfile
docker/local/mysql/my.cnf
```

### .env

```.env
# docker-compose.yml の名前を変えているため
COMPOSE_FILE=docker-compose-local.yml

# ポートが競合する場合は適宜変更
WEB_PORT=8080
DB_PORT=3306
# mysql、あとでCAKEPHPの設定ファイルに書く
DB_NAME=database_name
DB_USER=database_user
DB_PASS=database_password

# Mailpit関連。こちらもポートが競合する場合は適宜変更する
FORWARD_MAILPIT_PORT=1025
FORWARD_MAILPIT_DASHBOARD_PORT=8025
```

### docker-compose-local.yml
- あくまでlocal用なので、名前ちょっと変えてある
- 参考URLを紛失してしまったのだが、似たようなことをやっている人が居たのでほぼそのままパクって、Mailpitだけ追加
- Mailpitの設定は、Laravel sailで建てるときとほぼ同じ
 
``` docker-compose-local.yml
version: '3'
services:
  php:
    build:
      context: ./docker/local/php
      dockerfile: Dockerfile
    depends_on:
      - db
    volumes:
      - ./:/var/www
    ports:
      - ${WEB_PORT}:80

  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./docker/local/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
    ports:
      - ${DB_PORT}:3306
    restart: always
  mailpit:
    image: 'axllent/mailpit:latest'
    ports:
      - '${FORWARD_MAILPIT_PORT:-1025}:1025'
      - '${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025'
```

### Dockerfile
やってること、メモなど
- composerのハッシュ値は毎回公式で調べてね
- ドキュメントルートのパスを/var/www/webrootに変更
- Mailpitに送る時必要なのでsendmail
- あと、アプリが使うっぽい拡張をいくつか
    - zip
    - gd
- extensionについては、DockerでPHP拡張をインストールする方法をググって、適宜足したり引いたりしている（※一部、ちゃんと動いてないものがあるかも？詳細な動作は未確認）

``` Dockerfile
FROM php:8.1-apache

# Composer のバージョン と ハッシュ値
ARG composer_ver=2.5.8
ARG composer_hash=f07934fad44f9048c0dc875a506cca31cc2794d6aebfc1867f3b1fbf48dce2c5

# Composer の保存先
ARG composer_path=/usr/local/bin/composer
# DocumentRoot
ENV APACHE_DOCUMENT_ROOT /var/www/webroot

RUN apt-get update \
  && php -r "copy('https://getcomposer.org/download/$composer_ver/composer.phar', '$composer_path');" \
  && chmod 755 $composer_path \
  && php -r "if (hash_file('sha256', '$composer_path') !== '$composer_hash') { \
          echo '!!! Failed to install Composer !!!'; \
          unlink('$composer_path'); \
      } \
      echo PHP_EOL;" \
  && apt-get install -y  \
    vim \
    unzip \
    libicu-dev \
    libzip-dev \
    libonig-dev \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libjpeg-dev \
    sendmail \
    sendmail-cf \
    mailutils \
  && docker-php-ext-install \
    intl \
    pdo_mysql \
    zip \
    gd \
  && a2enmod rewrite

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

```

### my.cnf
- 適宜設定する（特別何もてないので割愛）

## アプリケーション側
- Mailpit に送る設定のみ変更。
- 注意点として、portは1025（FORWARD_MAILPIT_PORTで指定したポート番号ではない）

```app_local.php
    'EmailTransport' => [
        'default' => [
            'className' => 'Smtp',
            'host' => 'mailpit',
            'port' => 1025,
            'username' => null,
            'password' => null,
        ],
    ],
```

# 苦情・感想
- アプリケーションが特定のPHP拡張に依存してる場合はcomposer.json に記載しておいてほしい（マナー）
- というか、最初からDockerで環境建てて、リポジトリにdocker-compose.yml 入れといてほしい