web-dev-qa-db-ja.com

Composer PSR-4自動読み込みあり:名前空間のクラスが読み込まれません

私は次のプロジェクト構造を持っています:

- root
|- src <- Application specifc source
  |- [...]
|- tests
  |- [...]
|- Vendor
  |- myusername <- shared packages for all projects
    |- src
      |- MyNamespace
        |- File.php
  |- autoload.php
  |- test.php
|- composer.json

composer.jsonすでにPSR-4エントリがあります:

"autoload": {
     "psr-4": {
         "MyNamespace\\":"myusername/src"
     }
}

/Vendor/test.php

<?php
require 'autoload.php';

$file = new MyNamespace\File();
echo $file->isDone();

Vendor/myusername/src/MyNamespace/File.php

<?php
namespace MyNamespace;

class File
{
    public function isDone()
    {
        return 'Done!';
    }
}

しかし、私は常に致命的なエラーが発生しますFatal error: Class 'MyNamespace\File' not found in [...]

composer設定またはファイル構造は正しいですか?何ができますか?

編集1:

外部ベンダーをうまくロードできます

11
Gabriel Santos

コードに2つの問題があります。

PSR-4を間違って使用しています。

名前空間をフォルダーに埋め込む必要がなくなり、プロジェクトフォルダーのフットプリントがよりクリーンになりました。

PSR-0
vendor/<VendorName>/<ProjectName>/src/<NamespaceVendor>/<NamespaceProject>/File.php

PSR-4 (See that they removed the namespaces folders? Because you already reference that in composer.json
vendor/<VendorName>/<ProjectName>/src/File.php

したがって、あなたの場合は次のようになります。

Vendor/myusername/src/File.php

composer.jsonが無効です

         "MyNamespace\\":"myusername/src"

プロジェクトのコードを含むディレクトリへのフルパスは含まれません。次のようになります。

"autoload": {
     "psr-4": {
         "MyNamespace\\": "Vendor/myusername/src"
     }
}

ただし、ファイルを保存する最良の方法はvendorディレクトリの外です。これは、自動的にダウンロードされたライブラリで使用されるため、代わりに別の「開発」ディレクトリを選択します。

"autoload": {
     "psr-4": {
         "MyUsername\\MyProject\\": "src/myusername/myproject/src"
     }
}

コメントのSvenに感謝します。

15
Coded Monkey