编写器自动加载名称空间丢失



我正在开发一个使用独白的项目,它需要Psr/log。当我通过自动加载使用独白时,它会抱怨缺少PsrLogLoggerInterface。所以我查看了编译器生成的autoload_namespaces.php,我找不到Psr被注册了。

这是我的vendor/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/',
);

应该为所有在其编写器中定义了{autolload}的项目注册名称空间吗?json文件?(我检查了独白和Psr/Log,它们都定义了{autolload})

还是我对作曲家的理解有误?

您需要显式添加

"psr/log": "1.0.0"
编辑器中的

。Json要求块。项目monolog/monolog不需要psr/log[你可以在独白的作曲家中验证。json文件].

然后运行composer update来更新你的自动加载器文件

[UPDATE]出错了。

我正在使用独白1.2。*不需要psr/log。独白后1.3。*,它需要psr/log。在这种情况下,编写器应该在vendor/autoload_namespaces.php中加载psr/log命名空间。

例如,我刚刚更新了我的作曲家。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%

然后在我的vendor/composer/autoload_namespaces.php中,我找到了这个合适的条目:

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

这应该可以工作。有时候我也会直接输入

composer dump-autoload
重新生成vendor/composer/autoload_namespaces.php文件

我实际上对autoload_namespaces.php的数量感到困惑。我在我的问题中发布的一个是在vendor/,然后我在vendor/.composer/中找到了另一个,最后在 vendor/composer/ 中找到了正确的一个。

很抱歉回答我自己的(愚蠢的)问题,但这是值得一提的,以防其他一些开发人员有同样的麻烦。

感谢@川马的回答。

Composer在项目的composer.json文件中基于autoload注册类,例如

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

通常composer update会自动生成autoload_namespaces.php列出你的应用程序可以使用的所有名称空间(除非你使用多个自动加载器)。

如果名称空间缺失,下面是直接更新编写器自动加载器的命令:

composer dump-autoload -o

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

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

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

如果仍然失败,请仔细检查失败项目的composer.json文件中的语法(特别是autoload部分)。要调试,请尝试在-vvv或XDebug下运行composer。

相关内容

  • 没有找到相关文章

最新更新