【问题标题】:Composer's autloader can't find app class. Why?Composer 的自动加载器找不到应用程序类。为什么?
【发布时间】:2013-03-06 02:01:36
【问题描述】:

我的文件结构如下:

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),但这是正常行为吗?

【问题讨论】:

    标签: php autoload composer-php


    【解决方案1】:

    Composer/PSR-0 自动加载约定相当混乱。每次创建新的 Packagist 项目时,我都必须查找它。

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

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

    您所说的是“在project_root/src 中可以找到一个“供应商\App”命名空间。令人困惑的部分是您分配给该文件夹的每个嵌套命名空间(在本例中为“src” ) 期望由其中的另一个嵌套文件夹表示。

    这就是为什么你需要让你的类位于project_root/src/Vendor/App 以便被这个自动加载方案找到。

    旁注:如果你碰巧在你的类名中使用了任何下划线,这也可能导致其工作方式出现问题,因为下划线也意味着一个嵌套文件夹(即App\Models\Type\Entity,它指出到src/App/Models/Type/Entity.php,被视为与App/Models/Type_Entity.php 相同)。所以要小心下划线!

    【讨论】:

    • 谢谢!我已经尝试了一个小时来解决这个问题,文档(IMO,对于它的价值)还不够清楚。
    猜你喜欢
    • 2020-01-21
    • 2017-02-28
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2019-04-20
    • 2022-01-22
    相关资源
    最近更新 更多