Composer无法加载我自己的PSR-0文件。

7
我似乎无法使用psr-0自动加载机制,让composer与我自己的类/文件配合工作。有谁能解释一下为什么以下内容没有起作用吗?
我的错误日志中输出如下所示:
PHP致命错误:在/home/webroot/bitlama/index.php的第5行找不到“TestdirTest1”类。
如果我取消注释明确的require语句(index.php:2),它会起作用。
如果有人想知道 - 是的,我已经以 “php ../composer.phar install”的形式运行了composer安装。
这是我的目录结构:
├── composer.json
├── index.php
├── testspacedir
│   └── Testdir
│       └── test1.php
└── vendor
    ├── autoload.php
    └── composer
        ├── autoload_classmap.php
        ├── autoload_namespaces.php
        ├── autoload_real.php
        └── ClassLoader.php

composer.json:

{
    "autoload": {
        "psr-0": { "Testdir\\": "testspacedir/"}
    }
}

test1.php:

<?php

namespace Testdir;

class Test1 {

    public function __construct()
    {
        echo "Woohoo Test1";
    }

}

index.php:

<?php
require 'vendor/autoload.php';
//require 'testspacedir/Testdir/test1.php';

$test1 = new Testdir\Test1();

vendor/autoload.php:

<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer' . '/autoload_real.php';

return ComposerAutoloaderInit7b4760e0f7ca9d6454dd2f098c374ba4::getLoader();

请查看 vendor/composer/autoloader_namespaces.php 文件。其中应该包含一个以你的命名空间为数组键和正确文件夹路径的行。 - Sven
2个回答

3

我的类文件名为test1.php,而不是所需的PSR-0命名约定Test1.php


0

您说它正常工作是因为您移除了require 'testspacedir/Testdir/test1.php';这是正确的做法。

自从您在composer.json中定义了名称空间->文件夹结构,autoload就会处理这些文件夹的加载只要vendor/autoload.php

打开vendor/autoload.php文件,您就可以看到。

总之,Composer可以处理文件的自动加载,所以您不必执行这些包含操作。下面是来自http://getcomposer.org/doc/01-basic-usage.md#autoloading的一个片段:

注意:Composer提供了自己的自动加载器。如果您不想使用它,则可以直接包括vendor/composer/autoload_namespaces.php,该文件返回一个将名称空间映射到目录的关联数组。


我的意思是,只有在我明确地使用了那个 require 语句时代码才能正常工作。否则它会报致命错误。 - Chris Stryczynski
那我有点困惑,你是否手动检查了autoload.php文件,确保一切都正确并且路径设置正确? - SamV
说实话我也不太确定。我已经编辑了原始问题并附上了autoload.php的内容。 - Chris Stryczynski
沿着 include 路径查找,因为实际的自动加载文件帮助不大 :) - SamV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接