web-dev-qa-db-ja.com

Composerフォルダ内の複数のファイルを自動ロード

私は最新のプロジェクトでcomposerを使用しており、このように関数をマッピングしています

"require": {
    ...
},
"require-dev": {
    ...
},
"autoload": {
    "psr-4": {
        ...
    },
    "files": [
        "src/function/test-function.php"
    ]
}

フォルダー関数には、たとえばreal-function-1.php、real-function-2.phpなどのファイルがたくさんあると思います。つまり、composerフォルダー関数内のファイル?使用するのが面倒

"files": [
     "src/function/real-function-1.php",
     "src/function/real-function-2.php",
     ..,
     "src/function/real-function-100.php",
]

私のような怠け者はいますか...

18
Tiara Larasati

関数の名前空間を設定できない場合(大量のコードが破損するため、またはPSR-4を使用できないため)、関数を保持する静的クラスを作成したくない場合(自動ロードされる可能性があります) )、独自のグローバルインクルードファイルを作成し、composerに含めるように指示できます。

composer.json

{
    "autoload": {
        "files": [
            "src/function/include.php"
        ]
    }
}

include.php

$files = glob(__DIR__ . '/real-function-*.php');
if ($files === false) {
    throw new RuntimeException("Failed to glob for function files");
}
foreach ($files as $file) {
    require_once $file;
}
unset($file);
unset($files);

ファイル内の関数が使用されるかどうかに関係なく、要求ごとにすべてのファイルをロードするため、これは理想的ではありませんが、機能します。

注:インクルードファイルは、/ real-functionまたは同様のディレクトリの外に置いてください。または、それ自体も含まれ、再帰的な関数であることが判明し、最終的にメモリ例外がスローされます。

25
Austin

実際には、カスタムコードなしでこれを行うためのより良い方法があります。クラスを使用している場合は、 Composerのクラスマップ機能 を使用できます。関数を含む個々のファイルで作業している場合は、files[]配列を使用する必要があります。

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}
9
CommandZ