作曲家自动加载和命名空间的问题
Trouble with composer autoloading and namespaces
我正在尝试创建一个 Packagist/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"
}
}
}
一个例子class:
<?php
namespace Passthrough\Folder1;
class SomeClass
{
}
App.php
require 'vendor/autoload.php';
use Passthrough\Folder1\SomeClass;
$route = new SomeClass();
var_dump($route);
Fatal error: Class 'Passthrough\Folder1\SomeClass' not found in C:\wamp\www\PassthroughTester\app.php on line 7
由于您的示例脚本没有失败,包括 vendor/autoload.php
,我们可以放心地假设您实际上有 运行
$ composer dump-autoload
但是,如果您修改了自动加载配置 after 运行ning 上述命令,那么这可能是无法找到 class 的原因.
此外,假设自动加载已正确设置,那么脚本失败的唯一原因可能是 class Passthrough\Folder1\SomeClass
在 src/Passthrough/Folder1/SomeClass.php
中不存在,其中自动加载器实际上正在寻找它。
猜测
根据您的示例脚本和 link 到您的存储库的猜测,该示例实际上可能如下所示:
require 'vendor/autoload.php';
use Passthrough\Routing\Route\Route;
$route = new Route('foo', function () {
// . . .
});
var_dump($route);
那么输出是这样的:
PHP Fatal error: Class 'Passthrough\Base\Data\Callback' not found in /Users/am/Sites/Whosebug/34509692/src/Passthrough/Routing/Route/Route.php on line 92
PHP Stack trace:
PHP 1. {main}() /Users/am/Sites/Whosebug/34509692/app.php:0
PHP 2. Passthrough\Routing\Route\Route->__construct() /Users/am/Sites/Whosebug/34509692/app.php:7
Fatal error: Class 'Passthrough\Base\Data\Callback' not found in /Users/am/Sites/Whosebug/34509692/src/Passthrough/Routing/Route/Route.php on line 92
原因是 Passthrough\Routing\Route\Route::__construct()
中引用的 class Passthrough\Base\Data\Callback
实际上在您的项目中并不存在。
无关
与您的问题无关,但是为开发和 non-development 环境设置相同的自动加载没有意义,您应该相应地调整 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"
}
}
}
我正在尝试创建一个 Packagist/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"
}
}
}
一个例子class:
<?php
namespace Passthrough\Folder1;
class SomeClass
{
}
App.php
require 'vendor/autoload.php';
use Passthrough\Folder1\SomeClass;
$route = new SomeClass();
var_dump($route);
Fatal error: Class 'Passthrough\Folder1\SomeClass' not found in C:\wamp\www\PassthroughTester\app.php on line 7
由于您的示例脚本没有失败,包括 vendor/autoload.php
,我们可以放心地假设您实际上有 运行
$ composer dump-autoload
但是,如果您修改了自动加载配置 after 运行ning 上述命令,那么这可能是无法找到 class 的原因.
此外,假设自动加载已正确设置,那么脚本失败的唯一原因可能是 class Passthrough\Folder1\SomeClass
在 src/Passthrough/Folder1/SomeClass.php
中不存在,其中自动加载器实际上正在寻找它。
猜测
根据您的示例脚本和 link 到您的存储库的猜测,该示例实际上可能如下所示:
require 'vendor/autoload.php';
use Passthrough\Routing\Route\Route;
$route = new Route('foo', function () {
// . . .
});
var_dump($route);
那么输出是这样的:
PHP Fatal error: Class 'Passthrough\Base\Data\Callback' not found in /Users/am/Sites/Whosebug/34509692/src/Passthrough/Routing/Route/Route.php on line 92
PHP Stack trace:
PHP 1. {main}() /Users/am/Sites/Whosebug/34509692/app.php:0
PHP 2. Passthrough\Routing\Route\Route->__construct() /Users/am/Sites/Whosebug/34509692/app.php:7
Fatal error: Class 'Passthrough\Base\Data\Callback' not found in /Users/am/Sites/Whosebug/34509692/src/Passthrough/Routing/Route/Route.php on line 92
原因是 Passthrough\Routing\Route\Route::__construct()
中引用的 class Passthrough\Base\Data\Callback
实际上在您的项目中并不存在。
无关
与您的问题无关,但是为开发和 non-development 环境设置相同的自动加载没有意义,您应该相应地调整 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"
}
}
}