Composer的自动加载器无法找到应用类。为什么?

时间:2013-03-17 18:59:00

标签: php autoload composer-php

我有以下文件结构:

src/Models/Entity.php 
vendor/*
index.php
composer.*

Entity.php包含

<?php
namespace Vendor\App\Models;

class Entity {}

index.php包含

<?php
namespace Vendor\App;

require 'vendor/autoload.php';

use Vendor\App\Models\Entity;

$entity = new Entity();

composer.json包含:

{
    "autoload": {
        "psr-0": {"Vendor\\App\\": "src/"}
    }
}

vendor / composer / autoload_namespaces.php包含

<?php

// autoload_namespaces.php generated by Composer

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

return array(
    'Vendor\\App\\' => $baseDir . '/src/',
);

我得到127.0.0.1:37409 [500]: / - Class 'Vendor\App\Models\Entity' not found in ...

哪里出错? composer.json中复杂名称空间和/或源目录的格式是什么?

已更新:我找到了解决方法(将src / Models转移到src / Vendor / App / Models)但这是正常行为吗?

1 个答案:

答案 0 :(得分:6)

Composer / PSR-0自动加载惯例非常令人困惑。每次创建一个新的Packagist项目时我都要查找它。

创建composer.json文件并设置自动加载信息时,如下所示:

{
    "autoload": {
        "psr-0": { "Vendor\\App\\": "src/" }
    }
}

你所说的是“有一个'Vendor \ App”命名空间可以在project_root/src中找到。令人困惑的部分是你分配给该文件夹的每个嵌套命名空间(在这种情况下,' src')期望由。

中的另一个嵌套文件夹表示

这就是为什么您需要让您的班级位于project_root/src/Vendor/App以便通过此自动加载方案找到。

旁注:如果您碰巧在您的班级名称中使用任何下划线,这也会导致问题如何起作用,因为下划线也暗示了一个嵌套文件夹(即App\Models\Type\Entity,指向src/App/Models/Type/Entity.php的内容与App/Models/Type_Entity.php相同。所以要小心下划线!