Я думаю, что у меня есть некоторая путаница в отношении взаимосвязи между автозагрузкой PSR-4, структурой каталогов и пространствами имен.Итак, у меня есть структура каталогов, которая выглядит следующим образом.
Javelin (Project name)
- src
- - Utils
- - - ID
- - - ID.php (has the namespace "Utils")
- - - IDInterface.php (has namespace "Utils")
- - Value
- - - ValueInterface.php (has namespace "Domain\Value")
- - - Value.php (has namespace "Domaini\Value")
- tests
- - IDTest.php
- vendor
- // other stuff
И в моем файле composer.json у меня есть следующий
"autoload": {
"psr-4": {
"Javelin\\": "src/"
}
}
Мой файл IDTest выглядит так:
<?php
use PHPUnit\Framework\TestCase;
use Javelin\Utils\ID;
/**===========================
|| IDTest
==============================
*/
class IDTest extends TestCase
{
public function testConstructFromString()
{
$id = new ID("foo");
$this->assertSame("foo", $id->value());
}
}
?>
Когда я запускаюВ этом тесте я получаю сообщение об ошибке, указывающее, что класс ID не может быть найден.Это можно исправить, изменив оператор использования, как показано ниже.
<?php
use PHPUnit\Framework\TestCase;
use Javelin\Utils\ID\ID;
/**===========================
|| IDTest
==============================
*/
class IDTest extends TestCase
{
public function testConstructFromString()
{
$id = new ID("foo");
$this->assertSame("foo", $id->value());
}
}
?>
Но теперь я получаю следующую ошибку.
PHP Fatal error: Class 'Javelin\Domain\Value\Value' not found in /path/to/my/projects/Javelin/src/Utils/ID/ID.php on line 20
Вот файл, на который он ссылается.
<?php
namespace Utils;
use Javelin\Utils\ID\IDInterface;
use Javelin\Domain\Value\Value;
use Javelin\Exceptions\IllegalArgumentException;
/**--------------------------------------------------------------------------
|
| ID
|
-----------------------------------------------------------------------------
|
| An ID represents an identifier
|
-----------------------------------------------------------------------------
*/
class ID extends Value implements IDInterface
{
// code goes here
}
?>
Теперь мои вопросы.Какова связь между пространствами имен и структурами каталогов в отношении автозагрузки PSR-4?Я попытался запустить composer dump-autoload
в попытке исправить это, но безуспешно.Я даже попытался заменить оператор использования в своем классе ID use Javelin\Domain\Value\Value;
на use Javelin\Domain\Value\Value\Value;
, думая, что мне нужно было указать дополнительный каталог «Value», как ранее в IDTest.Но ничего из этого не сработало.
Что я неправильно понимаю?