Composer 的自动加载器问题
Issue with Composer's Autoloader
我正在开始一个新的小型框架项目,我在我机器上的本地 GIT 存储库中有这个项目。我已经设置了一个测试项目,通过 Composer 拉入本地存储库,但是自动加载器没有按预期工作(Fatal Error: Class X not found
错误)。这是我第一次在自动生成的内容之外使用自动加载(例如,当使用现有框架时),尽管四处阅读,但我似乎无法解决这个问题。
套餐
为了让这个工作正常,包只包含一个 src
目录,在根目录中的 composer.json 文件顶部有一个 App.php
class .
composer.json
{
"name": "myvendor/framework",
"description": "Framework Description",
"license": "MIT",
"authors": [
{
"name": "Joe Bloggs",
"email": "joe@email.com"
}
],
"autoload": {
"psr-0": {
"Framework": "src/"
}
}
}
项目
composer.json
{
"repositories": [
{
"type": "vcs",
"url" : "../Framework"
}
],
"require": {
"myvendor/framework": "dev-master"
}
}
这成功克隆了本地存储库并将代码添加到 vendor
目录。
命名空间也像这样成功添加到 Composer 的 autoload_namespaces.php
文件中;
vendor/composer/autoload_namespaces.php
'Framework' => array($vendorDir . '/myvendor/framework/src'),
当我尝试加载 App
class 但是使用以下代码时,出现错误;
web/index.php
<?php
require_once '../vendor/autoload.php';
$app = new \Framework\App();
您正在为 class 加载程序使用 psr-0
规范。这意味着完整的命名空间必须在文件结构中可见。前缀仅告诉自动加载器要查找此命名空间。
因此,在您的情况下,您配置了 "Framework"
命名空间在 "src/"
目录中可用。这意味着 class \Framework\App
应该生活在 src/Framework/App.php
。在您的情况下,它存在于 src/App.php
中。这意味着自动加载器无法找到您的 class.
但是,有一个 class 加载程序规范可以满足您的需求:psr-4
。这也是推荐的规格(将来可能会删除 psr-0)。使用 PSR-4,文件结构仅包含配置前缀后的命名空间。所以当做 "psr-4": { "Framework\": "src/" }
时,一个叫做 \Framework\App
的 class 应该生活在 src/App.php
而一个叫做 \Framework\Some\Special\App
的 class 应该生活在 src/Some/Special/App.php
.
我正在开始一个新的小型框架项目,我在我机器上的本地 GIT 存储库中有这个项目。我已经设置了一个测试项目,通过 Composer 拉入本地存储库,但是自动加载器没有按预期工作(Fatal Error: Class X not found
错误)。这是我第一次在自动生成的内容之外使用自动加载(例如,当使用现有框架时),尽管四处阅读,但我似乎无法解决这个问题。
套餐
为了让这个工作正常,包只包含一个 src
目录,在根目录中的 composer.json 文件顶部有一个 App.php
class .
composer.json
{
"name": "myvendor/framework",
"description": "Framework Description",
"license": "MIT",
"authors": [
{
"name": "Joe Bloggs",
"email": "joe@email.com"
}
],
"autoload": {
"psr-0": {
"Framework": "src/"
}
}
}
项目
composer.json
{
"repositories": [
{
"type": "vcs",
"url" : "../Framework"
}
],
"require": {
"myvendor/framework": "dev-master"
}
}
这成功克隆了本地存储库并将代码添加到 vendor
目录。
命名空间也像这样成功添加到 Composer 的 autoload_namespaces.php
文件中;
vendor/composer/autoload_namespaces.php
'Framework' => array($vendorDir . '/myvendor/framework/src'),
当我尝试加载 App
class 但是使用以下代码时,出现错误;
web/index.php
<?php
require_once '../vendor/autoload.php';
$app = new \Framework\App();
您正在为 class 加载程序使用 psr-0
规范。这意味着完整的命名空间必须在文件结构中可见。前缀仅告诉自动加载器要查找此命名空间。
因此,在您的情况下,您配置了 "Framework"
命名空间在 "src/"
目录中可用。这意味着 class \Framework\App
应该生活在 src/Framework/App.php
。在您的情况下,它存在于 src/App.php
中。这意味着自动加载器无法找到您的 class.
但是,有一个 class 加载程序规范可以满足您的需求:psr-4
。这也是推荐的规格(将来可能会删除 psr-0)。使用 PSR-4,文件结构仅包含配置前缀后的命名空间。所以当做 "psr-4": { "Framework\": "src/" }
时,一个叫做 \Framework\App
的 class 应该生活在 src/App.php
而一个叫做 \Framework\Some\Special\App
的 class 应该生活在 src/Some/Special/App.php
.