作曲家的自动加载器问题



我正在开始一个新的迷你框架项目,我在机器上的本地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 FrameworkApp();

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

因此,在您的案例中,您配置了"Framework"命名空间在"src/"目录中可用。这意味着类FrameworkApp应该存在于src/Framework/App.php中。在您的情况下,它存在于src/App.php中。这意味着自动加载器找不到您的类。

但是,有一个类加载器规范可以满足您的需要:psr-4。这也是推荐的规范(psr-0将来可能会被删除)。对于PSR-4,文件结构仅包括配置的前缀之后的名称空间。因此,当执行"psr-4": { "Framework": "src/" }时,一个名为FrameworkApp的类应该存在于src/App.php中,一个称为FrameworkSomeSpecialApp的类应该在src/Some/Special/App.php中。

相关内容

  • 没有找到相关文章

最新更新