PHPプログラミング

Macが大文字小文字区別しないためCakePHPのMissingControllerExceptionが動く

Macのあるあるネタに引っかかってしまったのでメモっておきます。

スポンサーリンク

事象

ある開発者さんからAWSにデプロイしてほしいと依頼を受けて、受領したDockerfileとCakePHP一式を、ほいほいーっとFargateにデプロイしました。

が、しばらくしてAPIが正常に動かないと連絡をうけたので、エラーログを確認したところ、以下のような出力がありました。

2021-07-28 11:55:33 Error: [Cake\Http\Exception\MissingControllerException] Controller class UserCreate could not be found. in /var/www/html/vendor/cakephp/cakephp/src/Controller/ControllerFactory.php on line 158
Exception Attributes: array (
  'class' => 'UserCreate',
  'plugin' => NULL,
  'prefix' => 'Api',
  '_ext' => NULL,
)
Stack Trace:
...


コントローラーが見つからないというなんかすごい初歩的なエラー。。

そして原因調査のために僕のローカルPCのMac(後々聞くと、開発者さんもMacだった)でDocker立ち上げてテストすると正常に動く。。

Dockerってポータビリティがウリなのになぜ環境が変わると動かなくなるの??

原因

コントローラーの子ディレクトリの大文字小文字をミスっていたことでした。

具体的にはCakeのルーティングを

Router::prefix('Api', function ($routes) {
    $routes->connect('/user_create', ['controller' => 'UserCreate', 'action' => 'index']);
    $routes->connect('/user_get', ['controller' => 'UserGet', 'action' => 'index']);
...

のように設定しており、本来ならディレクトリ名を “Api” とすべきものを小文字の “api” と誤って作成していました。

$ ls -1 src/Controller/
api    ・・・ これが誤っていた
## Api    ・・・ これが正解
...

そしてMacにあるCakeのプロジェクトディレクトリをdocker-composeでマウントしてました。

services:
...
  phpfpm:
    build: ./docker/phpfpm
    volumes:
      - .:/var/www/html  ・・・ カレントディレクトリがプロジェクトのルートディレクトリ
...



と、以上が直接的な原因だったのですが、MacのファイルシステムAPFS(Apple File System) が、(デフォルトでは)大文字小文字の区別をしないため、ローカル環境で正常に稼働できてしまうことが、とても話をややこしくしてました。。orz

Tips

ディレクトリ名 “api” を “Api” に修正したものをGitHub にコミットしようとしたら、差分がでませんでした。

gitの以下コマンドで大文字小文字の区別できるようになり、ちゃんと差分が出力されました。

$ git config core.ignorecase false



ちなみに、この大文字小文字区別、冷静に考えるとWindowsも区別してないですね。なのでMac固有云々というよりクライアントPCはまあそういうものなんだと考え直しました。(Linuxサーバみたくコマンド叩いてるとそういう意識薄れますが)

あと大文字小文字区別する設定にすると動かなくなるアプリケーションがあるようなので変更する場合は要注意です。


今回は以上です〜ノシ

参考

(о ̄∇ ̄)/ぁざ~~っす

Docker for Mac に潜む罠? ファイル名の大文字・小文字の区別
Docker Desktop forMacユーザーマニュアル