Композитор с автозагрузкой PSR-4: классы из пространства имен не загружаются - программирование
Подтвердить что ты не робот

Композитор с автозагрузкой PSR-4: классы из пространства имен не загружаются

У меня есть следующая структура проекта:

- 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 [...]

Правильны ли настройки композитора или структура файла? Что я могу сделать?

РЕДАКТИРОВАТЬ 1:

Я могу нормально загружать внешних поставщиков

4b9b3361

Ответ 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

Ваш композитор .json недействителен

         "MyNamespace\\":"myusername/src"

Не включает полный путь к каталогу с кодом проекта. Это должно быть так:

"autoload": {
     "psr-4": {
         "MyNamespace\\": "Vendor/myusername/src"
     }
}

но лучший способ сохранить ваши файлы будет вне каталога vendor, так как он используется автоматически загружаемыми библиотеками, вместо этого выберите другой каталог "разработки":

"autoload": {
     "psr-4": {
         "MyUsername\\MyProject\\": "src/myusername/myproject/src"
     }
}

Спасибо Свену в комментариях.