我有以下文件结构:
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)但这是正常行为吗?
答案 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
相同。所以要小心下划线!