First Composer Package - 自动加载器无法正常工作

时间:2016-06-30 14:02:24

标签: php composer-php autoload

我尽力找到适用的问题/答案,但我认为我对自动加载器的理解不足以识别合适的答案。

我有一个包含以下composer.json的包:

{
    "name": "Pva_agent",
    "type":"library",
    "description" : "query the pva agent",
    "version":"0.1b",
    "authors" : [
        {
            "name":"Ed Greenberg",
            "email":"ed@precisionpros.com"
        }
    ],
    "minimum-stability":"dev",
    "require": {},
    "autoload": {
        "psr-0": {
            "Pva_agent": "."
        }
    }

}

我在编写器安装包后的目录结构:

.
./vendor
./vendor/autoload.php
./vendor/Pva_agent
./vendor/Pva_agent/Agent.php
./vendor/Pva_agent/composer.json
./vendor/Pva_agent/.gitignore
./vendor/composer
./vendor/composer/autoload_psr4.php
./vendor/composer/autoload_real.php
./vendor/composer/autoload_classmap.php
./vendor/composer/autoload_namespaces.php
./vendor/composer/installed.json
./vendor/composer/autoload_static.php
./vendor/composer/ClassLoader.php
./vendor/composer/LICENSE
./composer.lock
./composer.json
./test_pva_agent.php

我的测试程序:

<?php
require_once('vendor/autoload.php');

use Pva_agent\Agent;

$agent = new Agent();

我的结果:

edg@arthur pva_project $ php test_pva_agent.php 
PHP Fatal error:  Class 'Pva_agent\Agent' not found in /home/edg/PhpstormProjects/pva_project/test_pva_agent.php on line 6
PHP Stack trace:
PHP   1. {main}() /home/edg/PhpstormProjects/pva_project/test_pva_agent.php:0
edg@arthur pva_project $ 

我认为我不需要'use'语句,因为自动加载器应该找到类,对吧?

有人可以告诉我问题在哪里吗?

谢谢,

艾德·格林伯格

1 个答案:

答案 0 :(得分:0)

您的 Pva_agent 库不应位于vendor/目录中。此目录应仅包含Composer中自动生成的数据。此目录通常不存储在VCS中。

您应该考虑将您的目录结构重构为与此类似的内容:

.
|____composer.json
|____composer.lock
|____src
| |____Pva_agent
|____vendor

您的库功能应添加到src/Pva_agent目录。

考虑使用PSR-4而不是PSR-0来实现autoload功能,因为在添加类时无需重新生成自动加载器。添加分类后,必须在PSR-0的情况下运行dump-autoloader

对于上面的目录结构和PSR-4自动加载器,您的composer.json自动加载部分应该与此类似:

"autoload": {
    "psr-4": { "Pva_agent\\": "src/Pva_agent" }
}

此后您的图书馆应自动加载。您的自动加载库将在Pva_agent命名空间下注册。