【问题标题】:PSR-4 autoloader issuePSR-4 自动装载机问题
【发布时间】:2019-07-24 08:44:32
【问题描述】:

我无法看到我在使用自动加载器时做错了什么。我的文件夹结构如下:

| - src/
|    - Files/
|        - Bla.php
|    - Models/
|        - ...
| - vendor/
|     - ...
| composer.json

composer.json 自动加载部分看起来像这样:

"autoload": {
    "psr-4": {
        "Migrations\\" : "src/"
    }
}

现在Bla.php 看起来像这样:

<?php

namespace Migrations\Files;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

final class Bla extends AbstractMigration
{
    ...
}

我得到了错误:

Fatal error: Class 'Doctrine\Migrations\AbstractMigration' not found in /var/www/html/migrations/src/Files/Bla.php

当我查看vendor 文件夹时,包就在那里。在我的 IDE 中,索引也可以正常工作,因此我可以 CMD+单击AbstractMigration 文件而不会出现问题。

我已尝试删除 vendor 文件夹,清除 composer 缓存,执行转储自动加载并重新安装所有软件包,但似乎没有任何效果。

我在哪里犯错了?

【问题讨论】:

  • 您是否在使用 Composer 并包含 Composer 自动加载文件?
  • 我应该在哪里做呢?我不记得以前在项目中这样做过?不过,我正在使用一些作曲家存根代码......

标签: php composer-php autoload


【解决方案1】:

您需要包含 Composer 自动加载文件,否则您的应用程序不知道存在哪些类。它是composer在安装依赖时创建的一个文件,很多使用Composer的框架会自动为你包含这个文件,但是如果你不使用框架你需要自己包含这个文件。

require __DIR__ . '/vendor/autoload.php';

你需要把它放在哪里取决于你的应用程序,但最好尽早加载,如果你有一个引导文件,那么这就是放置它的地方。

你可以阅读它here

【讨论】:

  • 这确实解决了它,但是我的其他项目怎么知道如何自己包含它?从作曲家的角度来看,项目结构是相同的,srcvendorcomposer.json 位于同一文件夹级别
  • 您的其他项目是否使用框架或任何引导代码? Composer 还可以使用 PDR-0 类映射,它是直接文件夹到命名空间匹配,因此您以前的项目可能都使用 PSR-0。现在大多数包都使用 PSR-4,这需要 venodr/autoload 文件
  • 不,该项目是纯 PSR-4,并且仅将包含的 autoload 放在 PHP 代码嗅探器中,它本身就是 vendor 文件夹中的依赖项。对于这个特定的项目,它的文件夹是 PSR-0,我的 migration 文件夹是 PSR-4,但是 composer autoloader 不会自动加载 migration 文件夹,所以我认为它不应该做一个区别?
  • 如果没有看到这两个项目的更多内容,很难说。自从我深入了解 composer 也有一段时间了,因为我现在几乎所有的项目都是用 Laravel 构建的,它可以处理所有的自动加载。但是自动加载所做的所有工作都是从内存中创建一个自动加载寄存器,它将目录/类名映射到正确的文件并在请求时包含它。
  • 因此,如果您在项目中注册了 spl_autoloader,这可能是它不需要它的原因之一。如果您在项目中包含或需要这些文件,那么这也不需要自动加载器,一旦 php 找到该文件,它就知道去哪里获取该类。
猜你喜欢
  • 2018-08-25
  • 1970-01-01
  • 2017-08-22
  • 2018-07-25
  • 1970-01-01
  • 2014-03-24
  • 2021-08-29
  • 2015-01-08
  • 2014-08-02
相关资源
最近更新 更多