DEV Community

Yoichi Dan
Yoichi Dan

Posted on

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
Enter fullscreen mode Exit fullscreen mode

すると、 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();
Enter fullscreen mode Exit fullscreen mode

となると、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);
Enter fullscreen mode Exit fullscreen mode

結果としては以下のようになる。

// 一覧の中に
    "Aviboy2006\\MauticPluginCreator\\": [
        "/var/www/html/vendor/composer/../aviboy2006/mautic-plugin-creator/src"
    ]

// ファイルがあるか
false
Enter fullscreen mode Exit fullscreen mode

つまり、一覧に名前空間は登録されているが、 Plugin は取得できていない。

ちなみにプラグインは以下のようになっている。

<?php 

namespace Aviboy2006\MauticPluginCreator;

class Plugin
{
Enter fullscreen mode Exit fullscreen mode

ここで気づきましたが、 Plugin class のあるファイル名が plugin.php になっていました。

PSR-4 のロードは Class 名は Case-Sensitive であるらしく、今回のケースでいえば

$result = $autoloader->findFile('Aviboy2006\MauticPluginCreator\plugin');
// true
Enter fullscreen mode Exit fullscreen mode

となる。

optimize することでも動作する

composer dump-autoload-o オプションを付けるとマップが作成されるが、そちらは PSR-4 のような名前空間とパスのマップではなく、単純にファイルをリストした上でマップを作成するらしく、上述の名前空間とパス名での case-sensitive の問題は発生しません。

Top comments (0)