当前位置: 首页 > 知识库问答 >
问题:

缺少编写器自动加载名称空间?

华星驰
2023-03-14

我正在开发一个使用Monolog的项目,需要Psr/log。当我通过自动加载使用Monolog时,它会抱怨缺少Psr\Log\LoggerInterface。所以我查看作曲家生成的autoload_namespaces.php,我找不到注册的Psr。

这是我的供应商/autoload_namespaces.php的内容

return array(
'Symfony\\Component\\Process' => $vendorDir . '/symfony/process/',
'Monolog' => $vendorDir . '/monolog/monolog/src/',
'Imagine' => $vendorDir . '/imagine/Imagine/lib/',
'Gedmo' => $vendorDir . '/gedmo/doctrine-extensions/lib/',
'Gaufrette' => $vendorDir . '/knplabs/gaufrette/src/',
'Evenement' => $vendorDir . '/evenement/evenement/src',
'Doctrine\\ORM' => $vendorDir . '/doctrine/orm/lib/',
'Doctrine\\DBAL' => $vendorDir . '/doctrine/dbal/lib/',
'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/',
'Assetic' => $vendorDir . '/kriswallsmith/assetic/src/',
'Analog' => $vendorDir . '/analog/analog/lib/',
);

作曲家是否应该为composer.json文件中定义了{autoload}的所有项目注册名称空间?(我检查了Monolog和Psr/Log,它们都定义了{autoload}。)

还是我对作曲家有误解?

共有3个答案

汝墨一
2023-03-14

Composer基于项目的Composer中的自动加载注册类。json文件,例如。

{
  "autoload": {
    "classmap": [
      "path/to/FirstClass.php",
      "path/to/SecondClass.php"
    ]
  }
}

通常composer update将自动重新生成自动加载的\u名称空间。php列出了应用程序可以使用的所有名称空间(除非您使用多个自动加载程序)。

如果缺少命名空间,下面是直接更新作曲家自动加载器的命令:

composer dump-autoload -o

然后,您需要确保在我们的脚本顶部包含自动加载器:

<?php
require_once __DIR__ . '/vendor/autoload.php';

请参阅:如何使用Composer直接自动加载类?

如果仍然失败,请仔细检查失败项目的编写器中的语法。json文件(特别是自动加载部分)。要调试,请尝试使用-vvv或在XDebug下运行composer。

上官高逸
2023-03-14

我实际上被autoload_namespaces.php的数量弄糊涂了。我在我的问题中发布的是在供应商/中,然后我在供应商/。作曲家/中找到了另一个,最后在供应商/作曲家/中找到了正确的。

很抱歉回答了我自己的(愚蠢的)问题,但值得一提的是,以防其他开发人员也遇到同样的问题。

并且感谢@川妈的回答。

赵英哲
2023-03-14

您需要显式地添加

"psr/log": "1.0.0"

在你的作曲家。json需要块。项目monolog/monolog不需要psr/log[您可以在monolog的composer.json文件中验证这一点]。

然后运行作曲家更新来更新自动加载器文件。

[更新]犯了一个错误。

我使用的是独白1.2。*而且它不需要psr/log。在独白1.3*之后,它确实需要psr/log。在这种情况下,composer应该在vendor/autoload_名称空间中加载psr/log名称空间。php。

例如,我刚刚更新了我的作曲家。json应该有

"monolog/monolog": "1.3.*",

在require块中。然后运行composer update monolog/monolog[您可以再次运行此命令,查看它是否解决了您的问题]

Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing psr/log (1.0.0)
    Loading from cache

  - Removing monolog/monolog (1.2.1)
  - Installing monolog/monolog (1.3.1)
    Downloading: connection...
    Downloading: 100%

然后在我的供应商/作曲家/autoload_namespaces.php中,我找到了这个合适的条目:

    'Psr\\Log\\' => $vendorDir . '/psr/log',

这应该行得通。有时候我也只是跑步

composer dump-autoload

重新生成供应商/编写器/自动加载_名称空间。php文件。

 类似资料:
  • 我刚刚开始使用composer进行依赖关系管理,我很难弄清楚我是如何不遵守psr-4进行自动加载的,所以我来这里寻求建议。我有一个生成随机值的类,它已经在packagist上了。项目结构如下(我已将composer.json文件标记为A和B): 项目总监 composer.jsonA composer.jsonB 最后是RlandValue.php文件,它声明了ejFrancis命名空间 当我运行

  • 我不熟悉使用composer和psr-0。我尝试了一个使用composer和psr-0的小应用程序。我已经使用名称空间加载了一个特定的类。当我使用composer vendor/autoload调用一个类时,我得到了“未找到类”错误。 我的composer.json文件:/var/www/html/silexapp/composer.json 我的作曲家供应商自动加载文件:/var/www/htm

  • 我试图使用高斯,但我得到以下致命错误: 致命错误:类GuzzleHttp\ClientInterface在第13行的 /var/www/myapp/vendor/guzzlehttp/guzzle/src/functions.php中找不到 我正在使用composer autoloader自动加载: 发生了什么事? 编辑 我的composer.json: 编辑2 我的作曲家。锁 编辑3 编写器配置

  • 我遇到了使用作曲家psr-4自动加载功能和PHPUnit的问题。问题发生在我的本地机器以及TravisCI版本上。单元测试无法找到我的类,而普通脚本可以找到。 当然,任何配置都有问题,但我无法找出我做错了什么。提前感谢你的帮助。 这是我的项目文件结构: 公共/ src/ http/ urlhelper。php 小黑 超文本传输协议/ urlhelper.test.php 这是我的作曲家的作品。js

  • 问题内容: 当我尝试使用自动加载和命名空间时出现此错误: 致命错误:* 在 第10行的 /usr/local/www/apache22/data/public/php5.3/test.php中 找不到类’Class1’ * 谁能告诉我我在做什么错? 这是我的代码: Class1.php: test.php: 问题答案: Class1不在全局范围内。 请参见下面的工作示例: 编辑(2009-12-1

  • 例如,一个XML属性值是,但名称空间前缀“repository”从未在数据集中定义。(不要紧,提供商的最佳实践建议定义它!) 所以当我去解封一个示例集时,具有指定前缀的QName属性(在我上面的示例中为“Repository”)是空的!所以看起来JAXB正在“抛出”那些具有未定义名称空间前缀的属性QName值。我很惊讶,它甚至没有保留当地的名字。 理想情况下,我希望保持该值原样,但看起来我无法在绑