[PHP]composer dump-autoloadで、エラー「A non-empty PSR-4 prefix must end with a namespace separator」が出るとき

カテゴリ: composer

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'),
);

Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。