【问题标题】:First Composer Package - autoloader not working第一个 Composer 包 - 自动加载器不工作
【发布时间】:2016-06-30 23:05:44
【问题描述】:

我已尽力找到适用的问题/答案,但我认为我对自动加载器的了解不够,无法识别合适的答案。

我有一个包含以下 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": "."
        }
    }

}

composer安装包后我的目录结构:

.
./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'语句,因为自动加载器应该找到类,对吧?

谁能告诉我问题出在哪里?

谢谢,

艾德·格林伯格

【问题讨论】:

    标签: php composer-php autoload


    【解决方案1】:

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

    您应该考虑将您的目录结构重构为类似于以下的结构:

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

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

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

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

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

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

    【讨论】:

    • 嗯...谢谢,Lukas,但您的回答会产生更多问题 :) 作曲家将我的库置于供应商之下,就像它会将我从网络上获得的任何东西放在一起一样。
    • Composer 不应将您的源代码放在vendor/ 下。当您深入了解vendor/ 文件夹时,您应该会在列表中看到您的库的路径:vendor/composer/autoload_psr4.php。您可以查看我的PhiKettle library 的结构作为示例。尝试克隆项目并运行composer update
    猜你喜欢
    • 2013-06-16
    • 2016-06-10
    • 2013-02-17
    • 1970-01-01
    • 2015-01-23
    • 2014-09-12
    • 2016-06-06
    • 2017-11-26
    • 2020-01-21
    相关资源
    最近更新 更多