0

我正在开发一个使用 Monolog 的项目,该项目需要 Psr/log。当我通过自动加载使用 Monolog 时,它会抱怨缺少 Psr\Log\LoggerInterface。于是我查看了composer生成的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/',
);

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

还是我对作曲家有错误的想法?

4

3 回答 3

0

您需要明确添加

"psr/log": "1.0.0"

在你的 composer.json 需要块。该项目monolog/monolog不需要psr/log[您可以在 monolog 的 composer.json 文件中验证]。

然后运行composer update以更新您的自动加载器文件。

[更新]犯了一个错误。

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

例如,我刚刚更新了我的 composer.json 有

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

在要求块中。然后运行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 文件。

于 2013-04-15T22:27:08.833 回答
0

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

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

并感谢@Chuan Ma 的回答。

于 2013-04-16T18:33:30.453 回答
0

autoloadComposer 根据项目文件中的注册类composer.json,例如

{
  "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部分)中的语法。要进行调试,请尝试使用XDebug-vvv或在其下运行 composer 。

于 2017-11-21T19:35:49.833 回答