【问题标题】:Issue with Composer's AutoloaderComposer 的自动加载器问题
【发布时间】:2015-02-08 21:38:27
【问题描述】:

我正在着手开发一个新的迷你框架项目,该项目位于我机器上的本地 GIT 存储库中。我已经建立了一个测试项目,它通过 Composer 拉入本地 repo,但是自动加载器没有按预期工作(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"
  }
}

这成功克隆了本地 repo 并将代码添加到 vendor 目录。

命名空间也成功添加到 Composer 的autoload_namespaces.php 文件中,像这样;

供应商/作曲家/autoload_namespaces.php

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

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

web/index.php

<?php

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

$app = new \Framework\App();

【问题讨论】:

    标签: php composer-php autoload


    【解决方案1】:

    您正在为类加载器使用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 中。

    【讨论】:

    • 谢谢,整理好了!看来我还有一些阅读要做
    猜你喜欢
    • 2020-06-17
    • 2018-07-11
    • 2018-07-25
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多