PSR-4 autoloader致命错误:找不到类

Jer*_*ham 11 autoload composer-php psr-4

我有我的项目结构:

src/
   ?? Model/
      ?? User.php
Run Code Online (Sandbox Code Playgroud)

我的User.php文件如下所示:

<?php
namespace Bix\Model;

class User {
Run Code Online (Sandbox Code Playgroud)

我的composer.json自动加载器是这样的:

"autoload": {
    "psr-4": {
      "Bix\\": "src/"
    }
  }
Run Code Online (Sandbox Code Playgroud)

最后我的bootstrap.php是这样的:

use Bix\Model\User;

// PSR-4 Autoloader.
require_once "vendor/autoload.php";
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试创建一个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'),
); 
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出我上面的错误吗?

Wou*_*r J 21

首先,Linux(我不确定您使用哪台PC)区分大小写.在您的自动加载中,您定义了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();
Run Code Online (Sandbox Code Playgroud)

要么:

require_once "vendor/autoload.php";

use Bix\Model\User;

$user = new User();
Run Code Online (Sandbox Code Playgroud)

  • @JeremyKirkham更新自动加载配置后,你必须运行`composer dump-autoload`来更新自动加载器 (3认同)