Неисправимая ошибка автозагрузчика PSR-4: класс не найден

У меня есть структура моего проекта так:

src/
   ├─ Model/
      └─ User.php

Мой файл User.php выглядит так:

<?php
namespace Bix\Model;

class User {

И мой автозагрузчик composer.json таков:

"autoload": {
    "psr-4": {
      "Bix\\": "src/"
    }
  }

Наконец-то мой bootstrap.php такой:

use Bix\Model\User;

// PSR-4 Autoloader.
require_once "vendor/autoload.php";

Однако, если я попытаюсь создать new User()Я получаю ошибку Fatal error: Class 'User' not found in /var/www/public/api/v1/index.php on line 8

Глядя на файл autoload_psr4.php, он выглядит нормально:

// autoload_psr4.php @ создается Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname(dirname($vendorDir));

return array(
    'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'),
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'KeenIO\\' => array($vendorDir . '/keen-io/keen-io/src'),
    'Bix\\' => array($baseDir . '/src'),
); 

Кто-нибудь может указать, где я иду не так с вышесказанным?

1 ответ

Решение

Прежде всего, Linux (я не уверен, какой компьютер вы используете) чувствителен к регистру. В своей автозагрузке вы определили src/bixв то время как это src/Bix,

Но что более важно, в PSR-4 указанный префикс пространства имен не включается в структуру каталогов (чтобы избежать каталогов, содержащих только один каталог). В вашем случае, если вы настраиваете "Bix\\": "src/", класс Bix\Model\User должен быть расположен в src/Model/User.php,


РЕДАКТИРОВАТЬ: вы неправильно понимаете пространства имен PHP. В PHP вы не говорите "импортировать все из Bix\Model в глобальное пространство имен для этого файла "с use Bix\Model;, Вместо этого это означает: "Псевдоним Model в этом файле Bix\Model".

Так что вы должны сделать:

require_once "vendor/autoload.php";

use Bix\Model;

$user = new Model\User();

или же:

require_once "vendor/autoload.php";

use Bix\Model\User;

$user = new User();
Другие вопросы по тегам