2015-05-09 84 views
7

我有我的项目结构如下所示: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由作曲家

@generated
$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'), 
); 

有人可以指出我在哪里出错了吗?

回答

14

首先,Linux(我不确定你使用哪台PC)区分大小写。在自动加载中,您定义了src/bix,而它是src/Bix

但更重要的是,在PSR-4中,指定的名称空间前缀是而不是(包含在目录结构中以避免只包含一个目录的目录)。在你的情况下,如果你配置"Bix\\": "src/",类Bix\Model\User应位于src/Model/User.php


编辑:你误会PHP命名空间。在PHP中,你并不是说“将所有文件从Bix\Model导入到该文件的全局名称空间中”,其中use Bix\Model;。相反,这意味着:“此文件中的别名ModelBix\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(); 
+0

我更新了composer.json到这一点: “比克斯\\”: “SRC /” 和文件夹结构,这:src/Model/User.php但是在那里我仍然得到错误'class User not found' – JeremyKirkham

+1

@JeremyKirkham在你更新自动加载配置后,你必须运行'composer dump-autoload'来更新自动加载器 –

+0

我已经完成了。我用新的文件夹/结构自动加载器更新了我的问题。 – JeremyKirkham