21
composer の autoload の case-sensitive でハマった
mautic を触り始めているが PHP に関しては全然なので初歩的なことにハマった。
簡単なプラグインを作りたくて以下のリポジトリを使ってみようとしてみました。
https://github.com/aviboy2006/mautic-plugin-creator
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 上ではきちんとファイルを認識できていてクラスにジャンプもできている。
<?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
となる。
composer dump-autoload
に -o
オプションを付けるとマップが作成されるが、そちらは PSR-4 のような名前空間とパスのマップではなく、単純にファイルをリストした上でマップを作成するらしく、上述の名前空間とパス名での case-sensitive の問題は発生しません。