Связь между пространствами имен, структурой каталогов и автозагрузкой PSR-4 - PullRequest
0 голосов
/ 26 августа 2018

Я думаю, что у меня есть некоторая путаница в отношении взаимосвязи между автозагрузкой 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.Но ничего из этого не сработало.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...