Composer的Autoloader问题

时间:2015-02-08 01:06:07

标签: php composer-php autoload

我正在开始一个新的迷你框架项目,我在我的机器上的本地GIT仓库中。我已经设置了一个测试项目,通过Composer提取本地存储库,但是自动加载器没有按预期工作(Fatal Error: Class X not found错误)。这是我第一次在自动生成的内容之外使用自动加载(例如在使用现有框架时),尽管阅读过,我似乎无法解决这个问题。

封装

为了使这个工作正常,该包只包含一个src目录,在根目录下的composer.json文件之上有一个App.php类。

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文件中,如此;

供应商/作曲家/ autoload_namespaces.php

'Framework' => array($vendorDir . '/myvendor/framework/src'),

当我尝试使用以下代码加载App类时,我收到错误;

网络/ index.php的

<?php

require_once '../vendor/autoload.php';

$app = new \Framework\App();

1 个答案:

答案 0 :(得分:2)

您正在使用psr-0规范进行类加载器。这意味着必须在文件结构中显示完整的命名空间。前缀只告诉自动加载器要查找此命名空间。

因此,在您的情况下,您配置"Framework"名称空间在"src/"目录中可用。这意味着课程\Framework\App应该在src/Framework/App.php生活。在您的情况下,它存在于src/App.php中。这意味着自动加载器无法找到您的班级。

但是,有一个类加载器规范可以执行您想要的操作:psr-4。这也是推荐的规范(将来可能会删除psr-0)。使用PSR-4,文件结构仅包括配置的前缀后的命名空间。因此,在执行"psr-4": { "Framework\": "src/" }时,名为\Framework\App的班级应该在src/App.php生活,而名为\Framework\Some\Special\App的班级应该在src/Some/Special/App.php生活。