PHPのパッケージマネージャであるcomposerでdump-autoloadコマンドを実行したとき、以下のように「A non-empty PSR-4 prefix must end with a namespace separator」エラーが出る場合があります
$ composer dump-autoload
Generating autoload files
[InvalidArgumentException]
A non-empty PSR-4 prefix must end with a namespace separator.
これは、composer.jsonに記載したautoload/psr-4(もしくはautoload-dev/psr-4)でネームスペース名の指定時に、末尾にバックスラッシュ(\記号)がついていないのが問題です。
解決方法
それでは、composer.jsonのautoload/psr-4は、どのように定義するのが正しいでしょうか?
以下はダメな例です。(App\Controllerの末尾にバックスラッシュがついていません)
# ダメな例("App\\Controller"の末尾に\\が無い
{
"autoload": {
"psr-4": {
"App\\Controller": "src/controller"
}
},
...
これを以下のように変更すればよいです。jsonでバックスラッシュはエスケープ文字なので、バックスラッシュを2つ重ねる必要があることに注意してください。
# OKな例("App\\Controller"の末尾に\\が有る
{
"autoload": {
"psr-4": {
"App\\Controller\\": "src/controller"
}
},
...
上記の定義を行った場合、オートロードされるphpファイルの、ディレクトリ名、ファイル名、ネームスペース、およびクラス名は以下のようになります。
<?php
// src/controller/UserController.php
namespace App\Controller;
class UserController
{
...
composer.jsonを修正したらvalidateを実施
composer.jsonを修正したら、念のために'comoser validate'コマンドを実行して、他にエラーが無いかチェックしておくと良いでしょう。validateコマンドを使うことで、他の設定内容に問題ないかも併せてチェックしてくれます。以下のようにcomposer.json is validと出力されればOKです。
$ composer validate
./composer.json is valid
さらに、dump-autoloadも忘れずに
composer.jsonの定義の中でもautoloadの定義を変更したときは、変更内容を反映させるためにcomposer dump-autoloadコマンドの実行が必要です。dump-autoloadを実行して、Generating autoload filesと出力されればOKです。
$ composer dump-autoload
Generating autoload files
dump-autoloadの結果、自動生成されたファイルの中身が気になる場合は、ファイルvendor\composer\autoload_psr4.phpの中身を確認すればよいです。以下のように、autoload/psr-4で記載した内容が反映されているはずです。
# vendor\composer\autoload_psr4.php
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
...
'App\\Controller\\' => array($baseDir . '/src/controller'),
);