composer自动加载和命名空间出现问题



我正在尝试创建一个Packagist/Compoer包,用于命名空间和Composer的一些培训。我不知道如何允许从vendor/autoload.php自动加载。

实际代码可以在这里看到:https://github.com/ThomasKasper/Passthrough或作为下面的示例。

这是我的文件结构:

root
|---composer.json
|---src
    |----Passthrough
       |----Folder1
            |SomeClass.php
       |----Folder2
       |----Folder3
       |----Folder4

composer.json:

{
"name": "passthrough/passthrough",
"description": "A simple MVC framework",
"license": "MIT",
"keywords": ["passthrough", "framework"],
"require": {
    "php": ">=5.3.0"
},
"autoload": {
    "psr-4": {
        "Passthrough\": "src/Passthrough"
    }
},
"autoload-dev": {
    "psr-4": {
        "Passthrough\": "src/Passthrough"
    }
}
}

示例类:

<?php
namespace PassthroughFolder1;
class SomeClass
{
}

App.php

require 'vendor/autoload.php';
use PassthroughFolder1SomeClass;
$route = new SomeClass();
var_dump($route);

Fatal error: Class 'PassthroughFolder1SomeClass' not found in C:wampwwwPassthroughTesterapp.php on line 7

由于您的示例脚本没有失败,包括vendor/autoload.php,我们可以放心地假设您实际上已经运行了

$ composer dump-autoload

然而,如果您在运行上述命令后修改了自动加载配置,那么这可能是找不到该类的原因。

此外,假设自动加载已经正确设置,那么脚本失败的唯一原因可能是PassthroughFolder1SomeClass类不存在于src/Passthrough/Folder1/SomeClass.php中,自动加载程序实际上会在其中查找它

猜测

从您的示例脚本和到存储库的链接中推测,该示例实际上可能是这样的:

require 'vendor/autoload.php';
use PassthroughRoutingRouteRoute;
$route = new Route('foo', function () {
    // . . . 
});
var_dump($route);

那么输出是这样的:

PHP Fatal error:  Class 'PassthroughBaseDataCallback' not found in /Users/am/Sites/stackoverflow/34509692/src/Passthrough/Routing/Route/Route.php on line 92
PHP Stack trace:
PHP   1. {main}() /Users/am/Sites/stackoverflow/34509692/app.php:0
PHP   2. PassthroughRoutingRouteRoute->__construct() /Users/am/Sites/stackoverflow/34509692/app.php:7
Fatal error: Class 'PassthroughBaseDataCallback' not found in /Users/am/Sites/stackoverflow/34509692/src/Passthrough/Routing/Route/Route.php on line 92

原因是PassthroughRoutingRouteRoute::__construct()中引用的类PassthroughBaseDataCallback实际上不存在于您的项目中。

不相关

与您的问题无关,但为开发和非开发环境设置相同的自动加载没有意义,您应该相应地调整composer.json并删除autoload-dev部分:

{
    "name": "passthrough/passthrough",
    "description": "A simple MVC framework",
    "license": "MIT",
    "keywords": ["passthrough", "framework"],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-4": {
            "Passthrough\": "src/Passthrough"
        }
    }
}

有关参考,请参见https://getcomposer.org/doc/04-schema.md#autoload-dev。

相关内容

  • 没有找到相关文章

最新更新