Reputation: 4974
I have the follow project structure:
- 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
already have a PSR-4 entry:
"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!';
}
}
But I always get fatal error Fatal error: Class 'MyNamespace\File' not found in [...]
Are the composer settings or file structure correct? What I can do?
EDIT 1:
I can load external vendors fine
Upvotes: 13
Views: 28161
Reputation: 605
There are 2 things wrong with your code.
You are using PSR-4 wrong.
They removed the need to embed the namespace in your folders, making a cleaner footprint in your project folder.
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
So in your case it would be:
Vendor/myusername/src/File.php
Your composer.json is invalid
"MyNamespace\\":"myusername/src"
Doesn't include the full path to the directory with your project's code. It should be like this:
"autoload": {
"psr-4": {
"MyNamespace\\": "Vendor/myusername/src"
}
}
but the best way to store your files would be outside the vendor
directory, as that is used by automatically downloaded libraries, instead choose a different "development" directory:
"autoload": {
"psr-4": {
"MyUsername\\MyProject\\": "src/myusername/myproject/src"
}
}
Thanks to Sven in the comments.
Upvotes: 16