composer の autoload の case-sensitive でハマった

mautic を触り始めているが PHP に関しては全然なので初歩的なことにハマった。
プラグインを作りたかった
簡単なプラグインを作りたくて以下のリポジトリを使ってみようとしてみました。
https://github.com/aviboy2006/mautic-plugin-creator
README に沿って以下を実行。(ddev で実行している)
> ddev composer require aviboy2006/mautic-plugin-creator
> ddev ssh
$ php vendor/aviboy2006/mautic-plugin-creator/src/test.php
すると、 Fatal error: Uncaught Error: Class 'Aviboy2006\MauticPluginCreator\Plugin' not found のようになってしまう。
原因を探す
実行している test.php は以下のような簡単なもの。
<?php
use Aviboy2006\MauticPluginCreator\Plugin;
require_once __DIR__ . '/../../../autoload.php';

$greeting = new Plugin();
$greeting->initAction();
$greeting->initialiseBundle();
となると、autoload がうまくいっていない可能性が高い。ちなみに PhpStorm 上ではきちんとファイルを認識できていてクラスにジャンプもできている。
autoload されている一覧を表示する
<?php
$autoloader = require_once __DIR__ . '/../../../autoload.php';
// 一覧を出す
echo json_encode($autoloader->getPrefixesPsr4(), JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);

// ファイルがあるか
$result = $autoloader->findFile('Aviboy2006\MauticPluginCreator\Plugin');
echo json_encode($result);
結果としては以下のようになる。
// 一覧の中に
    "Aviboy2006\\MauticPluginCreator\\": [
        "/var/www/html/vendor/composer/../aviboy2006/mautic-plugin-creator/src"
    ]

// ファイルがあるか
false
つまり、一覧に名前空間は登録されているが、 Plugin は取得できていない。
ちなみにプラグインは以下のようになっている。
<?php 

namespace Aviboy2006\MauticPluginCreator;

class Plugin
{
ここで気づきましたが、 Plugin class のあるファイル名が plugin.php になっていました。
PSR-4 のロードは Class 名は Case-Sensitive であるらしく、今回のケースでいえば
$result = $autoloader->findFile('Aviboy2006\MauticPluginCreator\plugin');
// true
となる。
optimize することでも動作する
composer dump-autoload-o オプションを付けるとマップが作成されるが、そちらは PSR-4 のような名前空間とパスのマップではなく、単純にファイルをリストした上でマップを作成するらしく、上述の名前空間とパス名での case-sensitive の問題は発生しません。

23

This website collects cookies to deliver better user experience

composer の autoload の case-sensitive でハマった