Не удается загрузить классы, находящиеся в одной папке с PSR-4

Я пытаюсь обернуть голову вокруг автозагрузки composer / psr-4, так как я новичок в этом.

Мой проект имеет следующую структуру:

| ProjectName
|- src
|  |- MainComponent
|    |- MainClass.php
|  |- Component1
|    |- Foo.php
|    |- Bar.php
|  |- Component2
|    |- Baz.php
|- tests
|  |- FooTest.php
|  |- ...
|- vendor
|  |- [...]
|  |- ...
|- composer.json
|- phpunit.xml.dist

В моем composer.json у меня есть следующая запись psr-4:

"autoload": {
"psr-4": {
"MyName\\ProjectName\\": "src/"}
}

Я завершил свои первые компоненты и у меня есть классы пространства имен в Foo.php, например:

namespace MyName\ProjectName\Component1;

class FooClass
{
...
}

Теперь я хочу использовать FooClass в Bar.php (который находится в той же папке):

namespace MyName\ProjectName\Component1;

$foo = new FooClass();

И я получаю следующую ошибку:

Fatal error: Class 'MyName\ProjectName\Component1\FooClass' not found in
/path/to/Bar.php

Та же ошибка выдается при попытке с полным именем:

use MyName\ProjectName\Component1\FooClass;

$foo = new FooClass();

Странная вещь в том, что PHPUnit может правильно разрешать пространства имен, так как мои тесты загружаются и выполняются правильно, используя ту же самую инструкцию, что и выше.
Это мои тесты / FooTest.php:

use MyName\ProjectName\Component1\FooClass;

class FooTest extends PHPUnit_Framework_TestCase
...

$ phpunit
OK (15 tests, 383 assertions)

Что я делаю неправильно?

1

Решение

Ваши имена классов неверны. Как вы можете прочитать в ПСР-4 рфк Имена классов должны совпадать с именами файлов.

Поэтому, когда у вас есть путь к классу, как: src/Component1/Foo.php

Ваше пространство имен должно выглядеть так: \MyName\ProjectName\Component1 и имя класса должно быть:

class Foo { ... }

И в импорте:

use MyName\ProjectName\Component1\Foo;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]