私は次のプロジェクト構造を持っています:
- 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:
外部ベンダーをうまくロードできます
コードに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に感謝します。